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

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 内部类: 在一个类中定义另一个类,这样定义的类称为内部类。【包含内部类的类可以称为内部类的外部类】 如果想要通过一个类来使用另一个类,可以定

  • type 语句可以给一个已存在类型起一个新的名字。类型必须要有 CamelCase(驼峰方式)的名称,否则 编译器会产生一个警告。对规则为例外的是基本类型: usize,f32等等。 // `NanoSecond` 是 `u64` 的新名字。 type NanoSecond = u64; type Inch = u64; // 使用一个属性来忽略警告。 #[allow(non_camel_case