簡體   English   中英

使用匿名方法訂閱事件

[英]Subscribing to events using anonymous methods

我在理解以下內容的工作方式時遇到問題(代碼下方的問題):

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); }; (int i) => { Two(true); }; 與上述的()相反。 但是選項二在沒有正確簽名的情況下工作,那么為什么這個匿名方法會導致錯誤?

非常感謝。

選項二之所以起作用,是因為當省略參數列表時,編譯器會自動找出函數簽名是什么。 ()添加到委托關鍵字后,就定義了一個特定的參數列表,其中沒有一個,編譯器將進行擬合。

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

Microsoft的C#編程指南指出:

在一種情況下,匿名方法提供了lambda表達式中找不到的功能。 匿名方法使您可以省略參數列表。 這意味着可以將匿名方法轉換為具有各種簽名的委托。 對於lambda表達式,這是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM