本文实例分析了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 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定
type 语句可以给一个已存在类型起一个新的名字。类型必须要有 CamelCase(驼峰方式)的名称,否则 编译器会产生一个警告。对规则为例外的是基本类型: usize,f32等等。 // `NanoSecond` 是 `u64` 的新名字。 type NanoSecond = u64; type Inch = u64; // 使用一个属性来忽略警告。 #[allow(non_camel_case