使用匿名方法订阅事件

时间:2014-10-27 01:24:41

标签: c# events delegates anonymous-function

我在理解下面的工作原理时遇到了问题(代码下面的问题):

private delegate void MyDelegate(int i);
private event MyDelegate myEvent;

public void EventTests() {
    //Option One
    myEvent += One;

    //Option Two
    myEvent += delegate{ Two(true); };

    //Option Three
    myEvent += () => { Two(true); };
}

private void One(int i) { }

private void Two(bool j) { }

问题:

  1. 我可以理解Option One的工作原理,因为事件myEvent期望一个带有int参数的委托附加到它。为什么选项二工作呢?它附加了一个带有错误签名的匿名方法到事件,没有?

  2. 因此,如果选项二有效,为什么选项三不起作用?似乎签名需要(int i) => { Two(true); };而不是(),如上所述。但是选项二没有正确的签名,所以为什么这个匿名方法会导致错误?

  3. 非常感谢。

1 个答案:

答案 0 :(得分:1)

选项二有效,因为编译器会在省略参数列表时自动确定函数签名是什么。将()添加到delegate关键字后,您已经定义了一个无特定的参数列表,并且编译器会抛出一个拟合。

选项三是lambda表达式,其中定义了不正确的参数列表。

微软的C# Programming Guide州:

  

有一种情况是匿名方法提供lambda表达式中找不到的功能。匿名方法使您可以省略参数列表。这意味着可以将匿名方法转换为具有各种签名的委托。对于lambda表达式,这是不可能的。