C#匿名方法与Delegate类型转换错误分析
2023-06-13 09:15:31 时间
本文实例分析了C#匿名方法与Delegate类型转换错误。分享给大家供大家参考。具体分析如下:
问题描述
C#2.0出现了匿名方法,这在一定程度上节省了我们维护代码上下文的精力,也不需要思考为某个方法取什么名字比较合适.在FCL的一些方法中要求传入一个Delegate类型的参数,比如Control.Invoke或者Control.BeginInvoke方法:
publicIAsyncResultBeginInvoke(Delegatemethod);
在这种情况下,如果不使用匿名方法,则需要在代码的上面先声明一个delegatevoidDoSomething()方法,然后可以在Invoke方法中再用lambda表达式或者委托实现DoSomething().
privatevoidApp()
{
XXControl.Invoke(newDoSomething(()=>
{
//DoSomething的具体操作
}));
}
这样做可以是可以,但使用匿名方法则更好,最起码看上去更简洁.
{
XXControl.Invoke(delegate
{
//DoSomething的具体操作
});
}
上面的代码会在编译的时候出错:CannotconvertanonymousmethodtotypeSystem.Delegatebecauseitisnotadelegatetype.方法要求参数的是一个委托(delegate)类型,而现在传递的只是一个匿名方法.产生这个错误最根本的原因是编译器在处理匿名方法的时候,没法推断出这个委托的方法返回的是什么类型,也就不知道返回一个什么样的委托.
解决方法
要解决上面这个问题,从根本上来说就是指定这个匿名方法将会返回什么类型的委托,有几种方法:
1.使用MethodInvoke或者Action
{
XXControl.Invoke((MethodInvoker)delegate()
{
//DoSomething的具体操作
});
}
privatevoidApp()
{
XXControl.Invoke((Action)delegate()
{
//DoSomething的具体操作
});
}
MethodInvoke和Action都是方法返回类型为空的委托.
2.可以给Control定义一个Invoke的扩展方法
{
control.Invoke((Delegate)action);
}
调用的时候则可以这样调用:
XXControl.Invoke(delegate{//DoSomething here});
//使用lambda表达式
XXControl.Invoke(()=>{//DoSomethinghere});
希望本文所述对大家的C#程序设计有所帮助。
相关文章
- C#生成Excel出现8000401a的错误的另一种解决办法。「建议收藏」
- C# 读写 Photoshop PSD文件 操作类「建议收藏」
- C#MQTTNET服务端使用说明
- 使用C#创建WebService实例
- c# mysql executenonquery_C#与数据库访问技术总结(八)之ExecuteNonQuery方法
- 2022年底C# 解压zip文件遇到的一个Bug
- c#打包发布时出现错误的解决方法总结详解编程语言
- C#读取文件为byte数组详解编程语言
- C#中接口(interface)的理解
- C#数组应用分析
- 比较有效的使用C#读取文件的代码
- C#位运算符整理
- c#Random快速连续产生相同随机数的解决方案
- asp.net(c#)文件下载实现代码
- 用C#中的params关键字实现方法形参个数可变
- c#引用类型构造器
- C#实现打印与打印预览功能的思路及代码
- c#连接access数据库操作类分享
- C#操作FTP出现500错误解决办法
- C#中使用1.7版本驱动操作MongoDB简单例子
- Redis总结笔记(二):C#连接Redis简单例子
- C#新手常犯的错误汇总
- C#使用ping命令的两个例子