关于匿名方法签名和事件处理程序的简单问题

时间:2009-04-28 00:14:00

标签: c#

所以,这可能只是一个简单的答案,但我不知道它是什么,我很好奇:)。为什么编译器允许我做这样的事情?

button1.Click += delegate { someFlag = true; };

(我只能使用.NET 2.0,所以没有lamdas,但是相同的概念)

但我不能这样做:

button1.Click += MyDelegateMethod

// snip

// compile error, signature does not match the signature of System.EventHandler.
private void MyDelegateMethod( )
{ 

}

我希望我必须将我的匿名方法声明为:

delegate(object sender, EventArgs e) { someFlag = true; };

我不明白为什么匿名方法可以,但是当我编写完整方法时不行。任何人吗?

2 个答案:

答案 0 :(得分:4)

编译器可以确定您的匿名委托与按钮Click委托的类型相同,但您不需要使用事件参数。

当您指定实际方法时,编译器会“看到”您指向具有错误签名的委托,因此无法编译。

答案 1 :(得分:1)

正如您所看到的,您正在使用delegate { ... }而不是delegate() { ... },这将允许C#为您完成工作。