我在理解下面的工作原理时遇到了问题(代码下面的问题):
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) { }
问题:
我可以理解Option One的工作原理,因为事件myEvent
期望一个带有int参数的委托附加到它。为什么选项二工作呢?它附加了一个带有错误签名的匿名方法到事件,没有?
因此,如果选项二有效,为什么选项三不起作用?似乎签名需要(int i) => { Two(true); };
而不是()
,如上所述。但是选项二没有正确的签名,所以为什么这个匿名方法会导致错误?
非常感谢。
答案 0 :(得分:1)
选项二有效,因为编译器会在省略参数列表时自动确定函数签名是什么。将()
添加到delegate关键字后,您已经定义了一个无特定的参数列表,并且编译器会抛出一个拟合。
选项三是lambda表达式,其中定义了不正确的参数列表。
微软的C# Programming Guide州:
有一种情况是匿名方法提供lambda表达式中找不到的功能。匿名方法使您可以省略参数列表。这意味着可以将匿名方法转换为具有各种签名的委托。对于lambda表达式,这是不可能的。