关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数
查看如下代码:
this.Invoke(delegate
{
MessageBox.Show("t4");
});
熟悉winform的开发者都知道,this是一个窗体的实例,故不做另外解释。该代码的运行,就会导致异常:{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }。
其实,要从错误的提示信息来看,这个匿名方法写的是一点问题都没有的。问题的关键是invoke这个函数的参数,我们查看其原型为:
public object Invoke(Delegate method)
也就说,它所接受的是一个Delegate,那么,任何一个派生自Delegate的实例,都是可被接受的。我们知道,类似ThreadStart,MethodInvoker都派生自Delegate,那么编译器在转化这个匿名函数的时候,就不知道要将这个匿名函数转为ThreadStart还是MethodInvoker,于是报错。(代表一个委托函数的,还有ParameterizedThreadStart、WaitCallback、AsyncCallback等,只不过他们都是带有参数的。)
正确的语法应该如下:
this.Invoke(new MethodInvoker(delegate { MessageBox.Show("t3"); }));
或者
this.Invoke((ThreadStart)delegate
{
MessageBox.Show("t4");
});
这样,编译器就知道要将匿名函数转化为哪个参数了。
题外话:注意这里,无论是new还是转型,都是一样的。
现将各类语法总结如下:
private void button1_Click(object sender, EventArgs e)
{
//将delegate转为ThreadStart
Thread t1 = new Thread((ThreadStart)delegate { MessageBox.Show("t1"); });
t1.Start();
//将delegate转为ThreadStart的第二种写法
Thread t2 = new Thread(new ThreadStart(delegate() { MessageBox.Show("t2"); }));
t2.Start();
//将delegate转为MethodInvoker
this.Invoke(new MethodInvoker(delegate { MessageBox.Show("t3"); }));
//将delegate转为ThreadStart
this.Invoke((ThreadStart)delegate
{
MessageBox.Show("t4");
});
//将delegate转为WaitCallback
ThreadPool.QueueUserWorkItem((WaitCallback)delegate
{
MessageBox.Show("t5");
});
//默认将delegate转为WaitCallback,因为QueueUserWorkItem只接受WaitCallback参数
ThreadPool.QueueUserWorkItem(delegate
{
MessageBox.Show("t5");
});
WaitCallback wc = new WaitCallback(this.DoSomethingWithState);
ThreadPool.QueueUserWorkItem(wc, "i am state.");
}
void DoSomethingWithState(Object c)
{
MessageBox.Show("t6" + c.ToString());
}
最后,附上几个Delegate的原型:
public delegate void ThreadStart();
public delegate void MethodInvoker();
public delegate void WaitCallback(object state);
public delegate void ParameterizedThreadStart(object obj);
public delegate void AsyncCallback(IAsyncResult ar);
关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }的更多相关文章
- 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
转自:http://www.cnblogs.com/xiaofei59/archive/2010/11/25/1887285.html 异常{ 无法将 匿名方法 转换为类型“System.Delega ...
- 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型:解决方法
http://blog.csdn.net/xiaochongchong1248/archive/2009/11/20/4841193.aspx?1271573283 编程环境要求:VS2008/FX2 ...
- 无法将匿名方法转换为System.Delegate
在WinForm中,不允许非UI线程访问UI,如果非UI线程需要跨线程调用UI控件,通常的解决办法是使用Control类中的Invoke方法,传递给该方法一个委托和委托调用的参数列表(params [ ...
- C#基础精华07(委托事件,委托的使用,匿名方法)
1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){ } √ void M2(string s){ } √ ...
- C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法
使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...
- 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)
委托与Lambda表达式 1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树 一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...
- c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对
首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...
- 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型
今天写winform的时候遇到一个问题,提示: 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型, 主要是为了在子线程中更新UI线程,在wpf中同样的写法 ...
- 委托、事件、匿名方法、Lambda
一.委托(delegate) 定义:public delegate void/类型 DefinedDelegate(参数1,参数2...) 委托是类型安全的. 委托实例:DefinedDe ...
随机推荐
- Free Mind » Blog Archive » Yakuake + dtach vs Screen + urxvt
Free Mind » Blog Archive » Yakuake + dtach vs Screen + urxvt Yakuake + dtach vs Screen + urxvt
- JavaFX2: 鼠标拖动选择和Ctrl+Shift连续区间选择的ListView
JavaFX2的ListView中的多选没有提供鼠标拖动选择的功能,同时按下Ctrl和Shift后连续的区间选中也不支持,以下代码用于处理这两个问题,细节见代码注释: import com.sun.j ...
- SPOJ DISUBSTR(字符串hash)
传送门:DISUBSTR 题意:给定一个字符串,求不同子串个数. 分析:由于数据较小,直接枚举长度为1,2...n的所有子串进行hash即可,复杂度(O(n^2)),后缀数组才是正解(O(nlogn) ...
- 警惕!iPhone 6即将上市 诈骗邮件已现身网络
随着iPhone 6即将上市,各路小道消息已经開始满天飞.就在近几日,一些记者还收到了假的iPhone 6将要上市的通知邮件.趋势科技也收到了几封,下面是样本之中的一个: (垃圾邮件样本) 不清楚iP ...
- android Vibrator 用法
private Vibrator mvibrator; 1.服务的句柄 mvibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 或者 ...
- 【POJ 1741】Tree
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11570 Accepted: 3626 Description ...
- NET实现的DDD、CQRS与微服务架构
WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例 最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间 ...
- 国内国外MD5在线解密站点
-http://www.cmd5.com/english.aspx (457,354,352,282) - http://www.md5crack.com - http://www.hashcheck ...
- SOLOWHEEL - 电动独轮车 - SOLOWHEEL俱乐部聚会活动火热报名中
SOLOWHEEL - 电动独轮车 - SOLOWHEEL俱乐部聚会活动火热报名中 SOLOWHEEL俱乐部聚会活动火热报名中
- C++内存管理学习笔记(7)
/****************************************************************/ /* 学习是合作和分享式的! /* Auth ...