C#匿名方法与Delegate类型转换错误分析
本文实例分析了C#匿名方法与Delegate类型转换错误。分享给大家供大家参考。具体分析如下: 问题描述 C#2.0出现了匿名方法,这在一定程度上节省了我们维护代码上下文的精力,也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数,比如Control.Invoke或者Control.BeginInvoke方法: 复制代码 代码如下: public object Invoke(Delegate method);
public IAsyncResult BeginInvoke(Delegate method); 在这种情况下,如果不使用匿名方法,则需要在代码的上面先声明一个delegate void DoSomething()方法,然后可以在Invoke方法中再用lambda表达式或者委托实现DoSomething(). 复制代码 代码如下: delegate void DoSomething();
private void App() { XXControl.Invoke(new DoSomething(() => { //DoSomething的具体操作 })); } 这样做可以是可以,但使用匿名方法则更好,最起码看上去更简洁. 复制代码 代码如下: private void App()
{ XXControl.Invoke(delegate { //DoSomething的具体操作 }); } 上面的代码会在编译的时候出错: Cannot convert anonymous method to type System.Delegate because it is not a delegate type. 方法要求参数的是一个委托(delegate)类型,而现在传递的只是一个匿名方法. 产生这个错误最根本的原因是编译器在处理匿名方法的时候,没法推断出这个委托的方法返回的是什么类型,也就不知道返回一个什么样的委托. 解决方法 要解决上面这个问题,从根本上来说就是指定这个匿名方法将会返回什么类型的委托,有几种方法: 1. 使用MethodInvoke或者Action 复制代码 代码如下: private void App()
{ XXControl.Invoke((MethodInvoker)delegate() { //DoSomething的具体操作 }); } private void App() { XXControl.Invoke((Action)delegate() { //DoSomething的具体操作 }); } MethodInvoke和Action都是方法返回类型为空的委托. 2. 可以给Control定义一个Invoke的扩展方法 复制代码 代码如下: public static void Invoke(this Control control,Action action)
{ control.Invoke((Delegate)action); } 调用的时候则可以这样调用: 复制代码 代码如下: //使用委托
XXControl.Invoke(delegate { //DoSomething here}); //使用lambda表达式 XXControl.Invoke(()=>{ //DoSomething here}); 希望本文所述对大家的C#程序设计有所帮助。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |