从异常{ 无法将 匿名方法 转换为类型“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);

参考链接:

1、从异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }说开去

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

从异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }说开去的更多相关文章

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

    转自:http://www.cnblogs.com/xiaofei59/archive/2010/11/25/1887285.html 异常{ 无法将 匿名方法 转换为类型“System.Delega ...

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

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

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

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

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

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

  5. MaterialDesignInXamlToolkit“无法绑定到目标方法,因其签名或安全透明度与委托类型的签名或安全透明度不兼容”异常的解决思路

    前言: 最初是想解答园友"小代码大世界 "的问题,后来想举一反三,将这个问题简单剖析下,做到知其所以然. MaterialDesignInXAML 控件库高度封装,有一些控件在使用 ...

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

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

  7. 无法将 DBNull.Value 强制转换为类型“System.DateTime”。请使用可空类型

    取数据库中的数据时,数据库中的字段有可能是空值,虽然Linq中的Field方法和SetField方法都可以处理可以为 null 的类型,不必像前面的示例那样检查 Null 值,我们再用Field将一些 ...

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

    this.BeginInvoke(() => { this.btnQuery.Enabled = false; //禁用查询 }); 跨线程调用时,编译上面的代码将提示 对于Control.In ...

  9. 具有键“XXX”的 ViewData 项属于类型“System.Int32”,但它必须属于类型“IEnumerable<SelectListItem>

    原因是Edit视图中有@Html.DropDownListFor(m => m.BirthdayAD... 但是没有从Controller中没有设置值

  10. [C#] C# 基础回顾 - 匿名方法

    C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...

随机推荐

  1. 题解:GZOI2024 D2T2 乒乓球

    考场上切了,但是比较神奇的题,应该是蓝/紫. Discription 乒乓球 \(\text{ }\)时间限制:\(\bold{3}\) 秒 众所周知,一场乒乓球比赛共有两个玩家 \(A\) 和 \( ...

  2. NIO聊天室

    SocketChannel 和 ServerSocketChannel ServerSocketChannel 用于创建服务器端套接字,而 SocketChannel 用于创建客户端套接字.它们都支持 ...

  3. AI五子棋_01 Python的网络通信

    AI五子棋 第一步 第一步 服务器是交战的战场,我们的AI大脑想要参战,先得找到去战场的路. 任务 1 写程序从以下网址取得下一步的指示 http://2**.2**.**.1**:9012/step ...

  4. Java统计list集合中重复的元素

    本题目能够从宏观上理解list.set.map三大集合的特点: 解决思路是:使用一个map,key用来记录list中的数据,我们知道set集合不允许元素重复,正好在map的jdk8的api中有一个ke ...

  5. vue暗含玄机的v-for指令

    由于是多个事项,那么这个数据模型是一个数组:为了显示这些代办事项我们首先添加一些样本数据 <script> export default { data() { return { title ...

  6. OpenFeign简单使用

    OpenFeign入门 什么是 OpenFeign? OpenFeign是一个远程访问的组件,用于两个微服务之间互相访问的中间件 OpenFeign使用步骤 1.添加OpenFeign的依赖 < ...

  7. Antlr4 语法解析器(下)

    Antlr4 的两种AST遍历方式:Visitor方式 和 Listener方式. Antlr4规则文法: 注释:和Java的注释完全一致,也可参考C的注释,只是增加了JavaDoc类型的注释: 标志 ...

  8. 4.6 Linux解压.gz格式的文件(gunzip命令)

    gunzip 是一个使用广泛的解压缩命令,它用于解压被 gzip 压缩过的文件(扩展名为 .gz). 对于解压被 gzip 压缩过的文件,还可以使用 gzip 自己,即 gzip -d 压缩包. gu ...

  9. 3.4 Linux文件(目录)命名规则

    介绍完 Linux 系统中目录结构之后,读者一定想知道如何为文件或目录命名. 我们知道,在 Linux 系统中,一切都是文件,既然是文件,就必须要有文件名.同其他系统相比,Linux 操作系统对文件或 ...

  10. 教你删除Linux中这些因特殊字符命名无法删除的文件

    我们都知道,在Linux删除一个文件可以使用rm命令,但是有一些特殊名称的文件使用普通的rm方式却没法删除,本文介绍Linux中删除特殊名称文件的多种方式. Linux文件命名规则 在介绍之前,简单说 ...