本文实例分析了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#程序设计有所帮助。
如对本文有疑问,
点击进行留言回复!!
相关文章:
-
-
-
C#实现猜数字游戏
本文实例为大家分享了c#实现猜数字游戏具体代码,供大家参考,具体内容如下给定一个0-100的随机数字猜其大小题目样式:电脑产生一个0到100之间的随机数字,并且...
[阅读全文]
-
-
C# 可空类型的具体使用
在项目中我们经常会遇到可为空类型,那么到底什么是可为空类型呢?下面我们将从4个方面为大家剖析。1、可空类型基础知识顾名思义,可空类型指的就是某个对象类型可以为空...
[阅读全文]
-
-
-
C#实现猜数字小游戏
本文实例为大家分享了c#实现猜数字小游戏的具体代码,供大家参考,具体内容如下效果如图:代码:using system;using system.collecti...
[阅读全文]
-
-
C#实现简单俄罗斯方块
最近在看《.net游戏编程入门经典 c#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。于是写下这篇文章留作纪念。1.类的设计在充...
[阅读全文]
-
网友评论