关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
来源:互联网 发布:人工智能之父 编辑:程序博客网 时间:2024/04/23 23:27
转自:http://www.cnblogs.com/xiaofei59/archive/2010/11/25/1887285.html
异常{ 无法将 匿名方法 转换为类型“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”,因为它不是委托类型 }
- 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
- 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型
- 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型
- 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型:解决方法
- 从异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }说开去
- C#委托类型 - (System.Delegate)
- 关于C#的委托类型【delegate 】
- 【C#】Func委托类型和匿名方法
- Linq集合查询出现无法将类型为“System.Int32”的对象强制转换为类型“System.String”异常
- ASP.NET.MVC异常--无法将类型为System.Int32的对象强制转换为类型System.String
- delegate C#关键字 (委托类型)
- 关于MVC中无法将类型为“System.Int32”的对象强制转换为类型“System.String”的问题。
- 委托 delegate(System.Delegate)
- dataGridView_关于如何解决无法将类型“void”隐式转换为“System.Data.Datatabel”
- 无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”。
- 错误:无法将类型为“System.DBNull”的对象强制转换为类型“System.Byte[]”。
- Android中获取正在运行的应用程序-----ActivityManager.RunningAppProcessInfo类详解 .
- hibernate3记录数据的增,删,该的操作日志记录(一)
- 企业管理软件的未来
- overflow:hidden同样会隐藏position:absolute的子元素
- 在Ubuntu上安装和使用mono
- 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }
- C# windows form程序怎么读取项目的跟路径
- Blocks, Operations, and Retain Cycles
- asp.net 获取客户端ip
- (简单模拟2.4.1)POJ 2000 Gold Coins(确定大数字序列中的某一位置在小数字序列中的位置)
- asp.net中将gridview数据导出成Excel
- Android 定时执行任务 AlarmManager的使用(可用于闹钟开发)
- hdu4481 Time travel
- mysql恢复sql文件的方法