转自: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”,因为它不是委托类型 }的更多相关文章

  1. 关于委托:异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }

    异常{ 无法将 匿名方法 转换为类型"System.Delegate",因为它不是委托类型 } 委托实际上是把方法名作为参数,但是若有好多个方法时,就要指明是哪个参数  查看如下代 ...

  2. 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型:解决方法

    http://blog.csdn.net/xiaochongchong1248/archive/2009/11/20/4841193.aspx?1271573283 编程环境要求:VS2008/FX2 ...

  3. 无法将匿名方法转换为System.Delegate

    在WinForm中,不允许非UI线程访问UI,如果非UI线程需要跨线程调用UI控件,通常的解决办法是使用Control类中的Invoke方法,传递给该方法一个委托和委托调用的参数列表(params [ ...

  4. C#基础精华07(委托事件,委托的使用,匿名方法)

    1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){  } √ void M2(string s){  } √ ...

  5. C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法

    使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...

  6. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

  7. c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...

  8. 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型

    今天写winform的时候遇到一个问题,提示: 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型, 主要是为了在子线程中更新UI线程,在wpf中同样的写法 ...

  9. 委托、事件、匿名方法、Lambda

    一.委托(delegate)     定义:public delegate  void/类型  DefinedDelegate(参数1,参数2...) 委托是类型安全的. 委托实例:DefinedDe ...

随机推荐

  1. weblogic jsp 不生效解决方法

    1. 检查weblogic.xml配置文件,其中如果有: <jsp-descriptor> <jsp-param> <param-name>pageCheckSec ...

  2. (转载)PHP去掉转义后字符串中的反斜杠\函数stripslashes

    (转载)http://www.beijibear.com/index.php?aid=182 addslashes()函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes()则是 ...

  3. 【最短路】FOJ 2243 Daxia like uber

    题目链接: http://acm.fzu.edu.cn/problem.php?pid=2243 题目大意: 给一张N个点M条边的有向图,从s出发,把在x1的人送到y1,在x2的人送到y2用的最短距离 ...

  4. MySQL 创建库

    CREATE DATABASE IF NOT EXISTS database_name DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 这种创建方式能保证数 ...

  5. Piggy-Bank(完全背包)

    /* http://acm.hdu.edu.cn/showproblem.php?pid=1114 完全背包问题 再判断背包能否装满 题意: 给出存空钱罐的重量以及装满时的重量 给出每种硬币的面值以及 ...

  6. Jenkins 八: 构建Git项目

    1. 安装git. http://git-scm.com/download/win 下载之后一步步安装即可.   2. 安装插件. 打开"系统管理" –> "管理插 ...

  7. VGO新闻 - VGO

    VGO新闻 - VGO VGO天津伊势丹店盛装揭幕 VGO天津伊势丹店盛装揭幕2013年9月7日,VGO(微高)全国首家实体店在天津伊势丹百货盛装开幕.现场,100多位商场领导及业内同仁共同出席了

  8. 其实H5制作就这样~

    今天的H5技术越来越成熟了,H5制作变得越来越简单化,尤其是H5制作工具(http://wcd.im/?_ta=2787)领域,基本上已经形成一条比较完整的产业链,所以对当下的企业来说,如果仍未体验过 ...

  9. Solr和IK分词器的整合

    IK分词器相对于mmseg4J来说词典内容更加丰富,但是没有mmseg4J灵活,后者可以自定义自己的词语库.IK分词器的配置过程和mmseg4J一样简单,其过程如下: 1.引入IKAnalyzer.j ...

  10. Java线程面试题 Top 50【转载】

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...