西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发C#.NET → C#匿名方法与Delegate类型转换出错的解决方案

C#匿名方法与Delegate类型转换出错的解决方案

相关软件相关文章发表评论 来源:西西整理时间:2011/4/30 22:23:52字体大小:A-A+

作者:西西点击:445次评论:0次标签: Delegate

  • 类型:音频处理大小:1.2M语言:英文 评分:5.0
  • 标签:
立即下载
 C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法:

0 public object Invoke(Delegate method);

1 public IAsyncResult BeginInvoke(Delegate method);

在这种情况下, 如果不使用匿名方法, 则需要在代码的上面先声明一个delegate void DoSomething()方法, 然后可以在Invoke方法中再用lambda表达式或者委托实现DoSomething().

0 delegate void DoSomething();

1

2 private void App()

3 {

4 XXControl.Invoke(new DoSomething(() =>

5 {

6 //DoSomething的具体操作

7 }));

8 }

这样做可以是可以, 但使用匿名方法则更好, 最起码看上去更简洁.

0 private void App()

1 {

2 XXControl.Invoke(delegate

3 {

4 //DoSomething的具体操作

5 });

6 }

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

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

1. 使用MethodInvoke或者Action

0 private void App()

1 {

2 XXControl.Invoke((MethodInvoker)delegate()

3 {

4 //DoSomething的具体操作

5 });

6 }
0 private void App()

1 {

2 XXControl.Invoke((Action)delegate()

3 {

4 //DoSomething的具体操作

5 });

6 }

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

2. 可以给Control定义一个Invoke的扩展方法

0 public static void Invoke(this Control control, Action action)

1 {

2 control.Invoke((Delegate)action);

3 }

调用的时候则可以这样调用:

0 //使用委托

1 XXControl.Invoke(delegate { //DoSomething here});

2 //使用lambda表达式

3 XXControl.Invoke(()=>{ //DoSomething here});

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)