2012-07-10 40 views
1

只是想知道爲什麼形式爲什麼BCL中沒有EventHandler <TSender,TEventArgs>委託?

public delegate void EventHandler<TSender, TEventArgs>(
     TSender sender, 
     TEventArgs e 
) 
where TEventArgs : EventArgs; 

的委託不框架中的存在。爲什麼只提供以下內容是有原因的嗎?

public delegate void EventHandler<TEventArgs>(
    object sender, 
    TEventArgs e 
) 
where TEventArgs : EventArgs; 
+0

因爲'sender'始終是'object'類型。泛型類型不是必需的或不允許的。 – 2012-07-18 06:58:33

回答

1

回答你的「爲什麼」的問題是不是除了他們誰知道容易—爲什麼微軟的工程師BCL決定這個,而不是另一種方式? —但我會做一個猜測:

public delegate void EventHandler<TEventArgs>(
    Object sender, 
    TEventArgs e 
) 
where TEventArgs : EventArgs 

我能想象,這個委託類型添加到.NET BCL爲「馬後炮」。請記住,.NET 1.0沒有泛型。

另一個原因是,事件處理程序通常只處理一個髮件人的事件,所以在處理程序中,您已經知道發件人,而無需查看sender參數,爲什麼要使委託更具通用性呢?需要用於最實際的目的。

您通常比發件人更感興趣的事件參數e,因此通過使其具有通用性來避免不必要的類型投射是有意義的。

+0

通常情況下,發送者也會回到用戶端,而使用更通用的代理很容易避免這種情況。顯然,當他們添加EventHandler 時,他們可以選擇添加EventHandler ,但我想他們故意跳過了這一點。我的問題的「原因」與此有關 - 使用此代表會出現問題嗎? – NoviceProgrammer 2012-07-10 06:50:41

+0

@NoviceProgrammer:我給出了一些可能的原因,爲什麼'TSender'類型的參數可能被省略,但我可以想到沒有技術上的必要性,*要求*它的缺席......除了*可能*那種類型推論/共同/逆變只有一個類型參數時效果更好...?最後,我想這僅僅是.NET BCL傢伙做出的決定。如果你一定要知道「爲什麼」,問問他們 - 雖然讓我問你,這真的值得嗎?你會從中獲得什麼? – stakx 2012-07-10 07:50:52

+0

感謝您分享您對此的看法。正如問題中提到的那樣,我只是很想知道設計選擇,如果我錯過了一個明顯的論點來支持這一點。 – NoviceProgrammer 2012-07-10 08:15:24

相關問題