none
请问大家如何理解MSDN上的:匿名方法使您能够省略参数列表,这意味着可以将匿名方法转换为带有各种签名的委托 RRS feed

  • 问题

  • 看了MSDN  上的关于匿名方法的一篇文章

    http://msdn.microsoft.com/zh-cn/library/0yw3tz5k(v=vs.110).aspx

    对这句话比较困惑:

    Anonymous methods enable you to omit the parameter list. This means that an anonymous method can be converted to delegates with a variety of signatures. This is not possible with lambda expressions.

    文章里没有给出相应的例子。

    请教一下大家是怎么理解的?

    谢谢!

    2013年10月30日 2:58

答案

  • >> Delegate d = md; 貌似编译不过

    是可以的。因为任何一个声明的委托必然间接(隐式)继承于Delegate类。

    class Program
        {
            delegate void MyDelegate(string s);
    
            static void Main(string[] args)
            {
                //定义了一个无参没有返回值的匿名函数
                Action a = delegate() { Console.WriteLine("没有参数!"); };
                //调用
                a();
    
                //忽略参数
    
                MyDelegate md = delegate { Console.WriteLine("MyDelegate带参数却不显示写出来!"); };
    
                //调用
                Delegate d = md;
                d.DynamicInvoke("s");
    
                Console.ReadLine();
            }
        }

    >>是不是可以这样理解,无论MyDelegate的签名如何,都可以将一个无参的匿名方法赋给它。

    就我的理解:任何委托即便带有参数,在声明delegate的时候完全可以忽略参数的声明,但是调用的时候仍然必须一一写清楚参数(见粗体部分)。


    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    • 已标记为答案 tyrbl 2013年10月30日 8:05
    2013年10月30日 6:36
    版主

全部回复

  • 你好:

    就是说如果原先的委托是带有参数的,现在完全可以忽略这些参数。并且可以转化成其它(没有参数)的委托。看我这个例子:

                //定义了一个无参没有返回值的匿名函数
                Action a = delegate() { Console.WriteLine("没有参数!"); };
                //调用
                a();
    
                //忽略参数
                MyDelegate md = delegate { Console.WriteLine("MyDelegate带参数却不显示写出来!"); };
    
                //调用
                Delegate d = md;
                d.DynamicInvoke(1); //这里必须写!

    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.


    2013年10月30日 3:33
    版主
  • 你好:

    就是说如果原先的委托是带有参数的,现在完全可以忽略这些参数。并且可以转化成其它(没有参数)的委托。看我这个例子:

                //定义了一个无参没有返回值的匿名函数
                Action a = delegate() { Console.WriteLine("没有参数!"); };
                //调用
                a();
    
                //忽略参数
                MyDelegate md = delegate { Console.WriteLine("MyDelegate带参数却不显示写出来!"); };
    
                //调用
                Delegate d = md;
                d.DynamicInvoke(1); //这里必须写!

    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.


    谢谢版主的回复。我不太理解“并且可以转化成其它(没有参数)的委托”。

    在我的测试代码中 : Delegate d = md; 貌似编译不过。

    我的测试例子

    class Program
        {
            delegate void MyDelegate(string s);
            delegate void Delegate(string s);

            static void Main(string[] args)
            {
                //定义了一个无参没有返回值的匿名函数
                Action a = delegate() { Console.WriteLine("没有参数!"); };
                //调用
                a();

                //忽略参数

               MyDelegate md = delegate { Console.WriteLine("MyDelegate带参数却不显示写出来!"); };

                //MyDelegate md = delegate(string s) { Console.WriteLine("MyDelegate带参数却不显示写出来!"); };

                md.DynamicInvoke("test");
                ////调用
                Delegate d = md;
                //d.DynamicInvoke(1); //这里必须写!

                Console.ReadLine();
            }
        }


    是不是可以这样理解,无论MyDelegate的签名如何,都可以将一个无参的匿名方法赋给它。

    比如:  MyDelegate md = delegate { Console.WriteLine("MyDelegate带参数却不显示写出来!"); };

    但如果匿名方法要用到参数,参数必须一致。

    MyDelegate md = delegate(string s) { Console.WriteLine("MyDelegate带参数却不显示写出来!"); };

    MyDelegate md = delegate(string s,string x) { Console.WriteLine("MyDelegate带参数却不显示写出来!"); }; 则编译不过。

    但是如何转化,能否麻烦给我一个例子?

    非常感谢!

    2013年10月30日 6:18
  • >> Delegate d = md; 貌似编译不过

    是可以的。因为任何一个声明的委托必然间接(隐式)继承于Delegate类。

    class Program
        {
            delegate void MyDelegate(string s);
    
            static void Main(string[] args)
            {
                //定义了一个无参没有返回值的匿名函数
                Action a = delegate() { Console.WriteLine("没有参数!"); };
                //调用
                a();
    
                //忽略参数
    
                MyDelegate md = delegate { Console.WriteLine("MyDelegate带参数却不显示写出来!"); };
    
                //调用
                Delegate d = md;
                d.DynamicInvoke("s");
    
                Console.ReadLine();
            }
        }

    >>是不是可以这样理解,无论MyDelegate的签名如何,都可以将一个无参的匿名方法赋给它。

    就我的理解:任何委托即便带有参数,在声明delegate的时候完全可以忽略参数的声明,但是调用的时候仍然必须一一写清楚参数(见粗体部分)。


    Click For donating:Free Rice For the poor
    For spamming-sender issues, you can either report it at Microsoft Spamming Issue, or just find "Report Spam Here+Number" at Forum Issue;You can also find "Verify Your Account+Number" at "Forum Issue", where you can submit to be confirmed to paste links or images.
    For more things to talk about? StackOverFlow is your choice.

    • 已标记为答案 tyrbl 2013年10月30日 8:05
    2013年10月30日 6:36
    版主
  • 有点明白了.
    2013年10月30日 8:05