为什么BCL中没有EventHandler <tsender,teventargs =“”>委托?</tsender,>

时间:2012-07-10 06:12:02

标签: .net event-handling

只是想知道为什么是表格的代表

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;

1 个答案:

答案 0 :(得分:1)

回答你的“为什么”问题并不容易 - 谁知道除了他们为什么微软的BCL工程师决定这个而不是另一种方式? - 但我会做出有根据的猜测:

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

我可以想象这个委托类型被添加到.NET BCL中作为“事后补充”。请记住,.NET 1.0没有泛型。

另一个原因是,事件处理程序通常只为一个发件人处理事件,因此在该处理程序中,您甚至不必查看sender参数即可了解发件人,那么为什么要让委托更多通用性超出了大多数实际需要。

您通常对事件参数e比对发件人更感兴趣,因此通过使其变得通用来避免不必要的类型转换是有意义的。