2009-04-28 40 views
2

所以,可能是一個簡單的問題,只是一個簡單的答案,但我不知道它是什麼,我很好奇:)。爲什麼編譯器允許我做這樣的事情?關於匿名方法簽名和事件處理程序的簡單問題

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; }; 

我不明白爲什麼它是確定了一個匿名方法,但是當我寫詩也不行e完整的方法本身。任何人?

回答

4

編譯器可以確定您的匿名委託與按鈕的類型相同單擊委託,但不需要使用事件參數。

雖然指定了一個實際的方法,但是編譯器會「看到」您指向的代碼簽名錯誤,因此無法編譯。

+0

「編譯魔術師」,這就是我想的:) – 2009-04-28 00:18:29

1

正如你所看到的,你正在使用delegate { ... }而不是delegate() { ... }這將允許C#爲你完成工作。

+0

是的,好點。我認爲它是一樣的。你知道他們怎麼說做--ass-umptions ... – 2009-04-28 00:19:12