2012-08-14 38 views
4
static void HandleDemoEvent(object sender, EventArgs e) 
{ 
    Console.WriteLine("bla-bla"); 
} 

static void Main(string[] args) 
{ 
    EventHandler handler; 
    MouseEventHandler mouseHandler; 

    handler = HandleDemoEvent; //Line#1 - Compile OK 
    mouseHandler = HandleDemoEvent; //Line#2 - Compile OK 
    mouseHandler = handler; //Line#3 Compile Error 1 Cannot implicitly convert type 'System.EventHandler' to 'System.Windows.Forms.MouseEventHandler' 

} 

兩個EventHandler委託類型和我自己的HandleDemoEvent方法具有相同的方法簽名。然而,第2行編譯良好(在播放時反轉),但第3行失敗,失敗的隱式類型轉換錯誤。一個簡單的例子,我直觀地理解爲什麼編譯錯誤發生在第3行,但我無法用某種形式的解釋來解決它。任何人都可以提出一個很好的理解來解釋差異嗎?分配兼容性,逆變和隱式類型轉換

回答

3

與前兩種情況相同,委託共同/反對僅適用於從方法構建委託時。

當您將一個代理人分配給另一個代理人時不起作用,如您的上一種情況。 (除非你使用通用delgates,在這種情況下,你可以使用共同的通用參數/逆變。)

EventHandler不是MouseEventHandler - 但兩者可以換一個void方法服用objectEventArgs

+0

「委託協同/逆變只適用於當您從方法構建委託時」 - 不知道。它解決了這個問題,其餘的都是微不足道的。謝謝:) – Trogvar 2012-08-14 10:38:34

+1

我想重要的部分是,前兩行正在做一些根本不同於最後一行:) – Rawling 2012-08-14 10:47:05