博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#匿名方法与Delegate类型转换错误
阅读量:5890 次
发布时间:2019-06-19

本文共 1369 字,大约阅读时间需要 4 分钟。

问题描述

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

public object Invoke(Delegate method);public IAsyncResult BeginInvoke(Delegate method);

        在这种情况下, 如果不使用匿名方法, 则需要在代码的上面先声明一个delegate void DoSomething()方法, 然后可以在Invoke方法中再用或者委托实现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});

参考

1.

2.

转载地址:http://fsfsx.baihongyu.com/

你可能感兴趣的文章
bash-shell-scripts高级脚本配置IP地址
查看>>
week04_python函数、参数及参数结构
查看>>
centos6.4_kvm 双网卡(adsl+局域网)配置
查看>>
电力行业IT运维管理解决方案
查看>>
Protostar format4
查看>>
SpringDataJpa的简单入门使用
查看>>
解决Wget下载时的乱码问题
查看>>
import android.support.v7.app.ActionBarActivity; 报
查看>>
ImageView显示超大图片
查看>>
bash的工作特性之命令执行返回值和命令展开的内容及练习示例
查看>>
linux 命令 —— gzip
查看>>
IDEA
查看>>
SecureCRT中用vbs脚本批量执行unix命令
查看>>
.NET中的泛型和Java泛型中的类型擦除
查看>>
时间:2014年4月13日14:32:08 加入购物车
查看>>
数据存储的四种常见方式
查看>>
WebStorm常用设置和常用快捷键
查看>>
Eclipse设置软tab(用4个空格字符代替)
查看>>
oracle创建监听Oracle Net Services 配置失败。退出代码是1
查看>>
java和php的hmac_sha1结果不同,求高手帮忙
查看>>