2014-10-27 34 views
1

我有如何理解下面的工作(以下代碼的問題)問題事件:訂閱使用匿名方法

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. 我可以理解爲什麼方案一級的作品,因爲事件myEvent需要一個具有int參數的委託來附加到它。爲什麼選項二的工作?它將帶有不正確簽名的匿名方法附加到事件中,否?

  2. 因此,如果選項二的作品,爲什麼選項三不工作?看起來簽名需要是(int i) => { Two(true); };而不是上面寫的()。但是選項二沒有正確的簽名,所以爲什麼這個匿名方法會導致錯誤?

非常感謝。

回答

1

選項二的作品,因爲編譯器會自動計算省略參數列表時的功能簽名。一旦將()添加到委託關鍵字中,您就已經定義了一個沒有特定參數的列表,並且編譯器會拋出一個錯誤。

選項三是一個lambda表達式,其中定義了不正確的參數列表。

微軟C# Programming Guide狀態:

有一種情況,即一個匿名方法提供了Lambda表達式未發現功能。匿名方法使您可以省略參數列表。這意味着匿名方法可以轉換爲具有各種簽名的代表。這對於lambda表達式來說是不可能的。