zoukankan      html  css  js  c++  java
  • 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});

    参考

    1. http://stackoverflow.com/questions/253138/anonymous-method-in-invoke-call

    2. http://staceyw1.wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/

    作者:Create Chen
    出处:http://technology.cnblogs.com
    说明:文章为作者平时里的思考和练习,可能有不当之处,请博客园的园友们多提宝贵意见。
    知识共享许可协议本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。

  • 相关阅读:
    Count_sort C++
    Priority_Queue C++
    HeapSort C++
    Randomized_QuickSort C++
    QuickSort c++
    我的开发环境
    github and eclipse
    centos 7 install eclipse cdt and use github
    github commands
    文化-梁晓声
  • 原文地址:https://www.cnblogs.com/technology/p/2033474.html
Copyright © 2011-2022 走看看