当前位置: 首页 > 编程笔记 >

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

万俟英锐
2023-03-14
本文向大家介绍C#匿名方法与Delegate类型转换错误分析,包括了C#匿名方法与Delegate类型转换错误分析的使用技巧和注意事项,需要的朋友参考一下

本文实例分析了C#匿名方法与Delegate类型转换错误。分享给大家供大家参考。具体分析如下:

问题描述 

C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法:

public object Invoke(Delegate method);

public IAsyncResult BeginInvoke(Delegate method);

在这种情况下, 如果不使用匿名方法, 则需要在代码的上面先声明一个delegate void DoSomething()方法, 然后可以在Invoke方法中再用lambda表达式或者委托实现DoSomething().

delegate void DoSomething(); 

private void App() 

{ 

    XXControl.Invoke(new DoSomething(() => 

    { 

        //DoSomething的具体操作 

    })); 

}

这样做可以是可以, 但使用匿名方法则更好, 最起码看上去更简洁.

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

private void App() 

{ 

    XXControl.Invoke((MethodInvoker)delegate() 

    { 

        //DoSomething的具体操作 

    }); 

}

private void App() 

{ 

    XXControl.Invoke((Action)delegate() 

    { 

        //DoSomething的具体操作 

    }); 

}

MethodInvoke和Action都是方法返回类型为空的委托.

2. 可以给Control定义一个Invoke的扩展方法

public static void Invoke(this Control control, Action action) 

{ 

    control.Invoke((Delegate)action); 

}

调用的时候则可以这样调用:

//使用委托 

XXControl.Invoke(delegate { //DoSomething  here}); 

//使用lambda表达式 

XXControl.Invoke(()=>{ //DoSomething here});

希望本文所述对大家的C#程序设计有所帮助。

 类似资料:
  • 本文向大家介绍详解C# 匿名对象(匿名类型)、var、动态类型 dynamic,包括了详解C# 匿名对象(匿名类型)、var、动态类型 dynamic的使用技巧和注意事项,需要的朋友参考一下 随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变。既然是强类型语言,那编写任一程序均要求满足下面的基本

  • 先前的章节中提过,委托是用于引用与其具有相同签名的方法,即使用委托对象,就可以调用任何被该委托引用的方法。 匿名方法提供了一种将一段代码块作为委托参数的技术。顾名思义,匿名方法没有名字,只有方法主体。 你不需要为匿名方法指定返回类型,其返回类型直接由方法主体推断而来。 编写匿名方法 匿名方法通过使用 delegate 关键字创建委托实例来实现方法的声明,如: delegate void Numbe

  • { let color = ['red','blue','green']; console.info(color.toString()); console.log(color.valueOf()); console.log(color); } 通过试验可以看到

  • 本文向大家介绍springmvc json类型转换错误解决方案,包括了springmvc json类型转换错误解决方案的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了springmvc json类型转换错误解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在用springmvc做json数据时,返回时,提示类型转换错误 如下,

  • 本文向大家介绍Java匿名类,匿名内部类实例分析,包括了Java匿名类,匿名内部类实例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java匿名类,匿名内部类。分享给大家供大家参考,具体如下: 内部类 匿名类  首发日期 :2018-03-25 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定

  • 主要内容:整型提升,通用的算术转换类型转换是一种将变量从一种数据类型转换为另一种数据类型的方法。 例如,如果要将值存储到简单整数()中,则可以将类型转换设置为。使用强制转换运算符将值从一种类型转换为另一种类型,如下所示 - 在Objective-C中,通常使用进行浮点运算,它是在位情况下从基本类型的派生的,在位情况下是类型。参考以下示例,使用转换运算符将一个整数变量除以另一个整数变量,结果为浮点数 - 执行上面示例代码,得到以下结