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#程序设计有所帮助。

(0)

相关推荐

  • 初步认识C#中的Lambda表达式和匿名方法

    写在前面 元旦三天在家闲着无事,就看了看Linq的相关内容,也准备系统的学习一下,作为学习Linq的前奏,还是先得说说Lambda与匿名方法的知识点.也算是对知识点的查漏补缺吧,也许你会说这没啥大不了的,项目中都在用,但是有些知识,你回头在查看的时候,总会有那么点不一样的收获,这点我是感同身受的,我看书有个习惯,一本书,我能看个三四遍,每次总会有收获.当然,你可以说,当时肯定没认真看,不是那样子的,我认为最直接的原因在于,当时你看是看,没有在真正的项目中遇到过,所以你心里对它的理解并不深,如果在

  • C#中的匿名方法实例解析

    本文较为详细的讲述了C#中的匿名方法,并附上实例加以说明.现将其分享给大家供大家参考之用.具体分析如下: 首先,C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代.虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式.但是,匿名方法的信息同样也适用于 Lambda 表达式,可以说 Lambda 表达式就是匿名方法演变过来的. 我们可以使用匿名方法来忽略参数列表. 这意味着匿名方法可转换为具有各种签名

  • C# 匿名方法基础回顾

    目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ≥ C# 3.0 的版本中,我们会用 Lambda 表达式进行取代匿名方法,并且用 Lambda 表达式作为编写内联代码的首选方式,因为它更简洁. 匿名方法是,顾名思义,匿名方法就是没有名称的方法.匿名方法最明显的好处就是:可以降低额外另写一个方法的工作量:另外一个好处就是可以直接访问调用者的变量,从而降低传参的复杂度. 匿名方

  • C#基础之匿名方法实例教程

    本文以实例形式讲解了C#的匿名方法的用法,分享给大家供大家参考之用.具体如下: 匿名方法是C# 2.0的语言新特性.首先看个最简单的例子: class Program { static void Main(string[] args) { List<string> names = new List<string>(); names.Add("Sunny Chen"); names.Add("Kitty Wang"); names.Add(&q

  • C#特性之匿名方法和Lambda表达式

    在我们程序中,经常有这样一些需求: 1.       需要一个临时方法,这个方法只会使用一次,或者使用的很少. 2.       这个方法的方法体很短,以至于比方法声明都短,写起来实在没劲(我将其称之为"一句话方法"). 没办法,这样的方法写起来真是吃力不讨好,比如一些按钮事件处理中,有些按钮点击就是弹出一个对话框,或者调用一下别的什么方法.比如下面的代码: 复制代码 代码如下: this.btnRefresh.Click += new System.EventHandler(this

  • c# 匿名方法的小例子

    复制代码 代码如下: // Create a handler for a click event.button1.Click += delegate(System.Object o, System.EventArgs e)                   { System.Windows.Forms.MessageBox.Show("Click!"); }; // Create a delegate.delegate void Del(int x); // Instantiate

  • C#实现在匿名方法中捕获外部变量的方法

    先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void TestDelegate(); static void Main(string[] args) { TestDelegate[] delegates = new TestDelegate[2]; int outside = 0; for(int i = 0; i < 2; i++) { int insid

  • C#警惕匿名方法造成的变量共享实例分析

    本文实例讲述了C#警惕匿名方法造成的变量共享.分享给大家供大家参考,具体如下: 匿名方法 匿名方法是.NET 2.0中引入的高级特性,"匿名"二字说明它可以把实现内联地写在一个方法中,从而形成一个委托对象,而不用有明确地方法名,例如: static void Test() { Action<string> action = delegate(string value) { Console.WriteLine(value); }; action("Hello Wor

  • C#用匿名方法定义委托的实现方法

    本文实例讲述了C#用匿名方法定义委托的实现方法.分享给大家供大家参考.具体实现方法如下: //用匿名方法定义委托 class Program { delegate string MyDelagate(string val); static void Main(string[] args) { string str1 = " 匿名方法外部 "; //中括号部分定义来了一个方法,没有名称,编译器会定指定一个名称 MyDelagate my = delegate(string param)

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

    本文实例分析了C#匿名方法与Delegate类型转换错误.分享给大家供大家参考.具体分析如下: 问题描述 C#2.0出现了匿名方法, 这在一定程度上节省了我们维护代码上下文的精力, 也不需要思考为某个方法取什么名字比较合适. 在FCL的一些方法中要求传入一个Delegate类型的参数, 比如Control.Invoke或者Control.BeginInvoke方法: 复制代码 代码如下: public object Invoke(Delegate method); public IAsyncRe

  • 探讨:如何使用委托,匿名方法对集合进行万能排序

    下面Demo中我使用了2种排序方式1.让Employee继承IComparable 接口,实现CompareTo方法排序2.定义一个方法使用Comparison<T>委托,排序的操作交给匿名方法 看完下面的代码,你知道使用Comparison<T>委托的好处吗? 复制代码 代码如下: class Employee:IComparable    {        public string Name { get; set; }        public int Age { get;

  • C#中匿名方法与委托的关系介绍

    当对2个数实现加减乘除,其中的一个解决方案是通过委托来实现.如下: class Program { private delegate int CaculateDel(int num1, int num2); static void Main(string[] args) { CaculateDel caculateDel = Add; Console.WriteLine(caculateDel.Invoke(1,2).ToString()); Console.ReadKey(); } stati

随机推荐