源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#匿名方法与Delegate类型转换错误分析

  • 时间:2020-08-23 18:50 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C#匿名方法与Delegate类型转换错误分析
本文实例分析了C#匿名方法与Delegate类型转换错误。分享给大家供大家参考。具体分析如下: 问题描述  C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法:
[u]复制代码[/u] 代码如下:
public object Invoke(Delegate method); public IAsyncResult BeginInvoke(Delegate method);
在这种情况下, 如果不使用匿名方法, 则需要在代码的上面先声明一个delegate void DoSomething()方法, 然后可以在Invoke方法中再用lambda表达式或者委托实现DoSomething().
[u]复制代码[/u] 代码如下:
delegate void DoSomething(); private void App() {     XXControl.Invoke(new DoSomething(() =>     {         //DoSomething的具体操作     })); }
这样做可以是可以, 但使用匿名方法则更好, 最起码看上去更简洁.
[u]复制代码[/u] 代码如下:
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
[u]复制代码[/u] 代码如下:
private void App() {     XXControl.Invoke((MethodInvoker)delegate()     {         //DoSomething的具体操作     }); } private void App() {     XXControl.Invoke((Action)delegate()     {         //DoSomething的具体操作     }); }
MethodInvoke和Action都是方法返回类型为空的委托. 2. 可以给Control定义一个Invoke的扩展方法
[u]复制代码[/u] 代码如下:
public static void Invoke(this Control control, Action action) {     control.Invoke((Delegate)action); }
调用的时候则可以这样调用:
[u]复制代码[/u] 代码如下:
//使用委托 XXControl.Invoke(delegate { //DoSomething  here}); //使用lambda表达式 XXControl.Invoke(()=>{ //DoSomething here});
希望本文所述对大家的C#程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部