Csharp/C#教程:C#匿名方法与Delegate类型转换错误分析分享

本文实例分析了C#匿名方法与Delegate类型转换错误。分享给大家供大家参考。具体分析如下:

问题描述 

C#2.0出现了匿名方法,这在一定程度上节省了我们维护代码上下文的精力,也不需要思考为某个方法取什么免费精选名字大全比较合适.在FCL的一些方法中要求传入一个Delegate类型的参数,比如Control.Invoke或者Control.BeginInvoke方法:
代码如下:publicobjectInvoke(Delegatemethod);

publicIAsyncResultBeginInvoke(Delegatemethod);

在这种情况下,如果不使用匿名方法,则需要在代码的上面先声明一个delegatevoidDoSomething()方法,然后可以在Invoke方法中再用lambda表达式或者委托实现DoSomething().
代码如下:delegatevoidDoSomething();
privatevoidApp()
{
   XXControl.Invoke(newDoSomething(()=>
   {
       //DoSomething的具体操作
   }));
}

这样做可以是可以,但使用匿名方法则更好,最起码看上去更简洁.
代码如下:privatevoidApp()
{
   XXControl.Invoke(delegate
   {
       //DoSomething的具体操作
   });
}

上面的代码会在编译的时候出错:CannotconvertanonymousmethodtotypeSystem.Delegatebecauseitisnotadelegatetype.方法要求参数的是一个委托(delegate)类型,而现在传递的只是一个匿名方法.产生这个错误最根本的原因是编译器在处理匿名方法的时候,没法推断出这个委托的方法返回的是什么类型,也就不知道返回一个什么样的委托.

解决方法

要解决上面这个问题,从根本上来说就是指定这个匿名方法将会返回什么类型的委托,有几种方法:

1.使用MethodInvoke或者Action
代码如下:privatevoidApp()
{
   XXControl.Invoke((MethodInvoker)delegate()
   {
       //DoSomething的具体操作
   });
}
privatevoidApp()
{
   XXControl.Invoke((Action)delegate()
   {
       //DoSomething的具体操作
   });
}

MethodInvoke和Action都是方法返回类型为空的委托.

2.可以给Control定义一个Invoke的扩展方法
代码如下:publicstaticvoidInvoke(thisControlcontrol,Actionaction)
{
   control.Invoke((Delegate)action);
}

调用的时候则可以这样调用:
代码如下://使用委托
XXControl.Invoke(delegate{//DoSomething here});
//使用lambda表达式
XXControl.Invoke(()=>{//DoSomethinghere});

希望本文所述对大家的C#程序设计有所帮助。

您可能感兴趣的文章:c#将list类型转换成DataTable方法示例浅析C#数据类型转换的几种形式C#.net中的类型转换详细介绍C#基础之数据类型转换C#调用C++版本dll时的类型转换需要注意的问题小结C#难点逐个击破(9):类型转换C#中的自动类型转换和强制类型转换

标签: 类型转换 方法 le te 匿名方法

详解C++的模板中typename关键字的用法

浅析C语言中堆和栈的区别

上述就是C#学习教程:C#匿名方法与Delegate类型转换错误分析分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/905910.html

(0)
上一篇 2021年10月23日
下一篇 2021年10月23日

精彩推荐