为什么.NET事件的发送者参数类型为object而不是T类型?

时间:2011-08-14 14:40:25

标签: c# .net generics event-handling

  

可能重复:
  In a C# event handler, why must the "sender" parameter be an object?
  Event Signature in .NET — Using a Strong Typed 'Sender'?

为什么.NET中的所有事件都有object类型的第一个参数,而不是通用类型T?每次我必须得到我的发件人,我必须将它转换为更多派生类型。例如:

(Button)sender

3 个答案:

答案 0 :(得分:8)

因为事件处理程序方法的通用签名是在将泛型添加到语言之前很久就发明的。

使用System.Object是仿制药之前几天的合理选择,因为它确实是最“通用”的对象。所有其他对象最终都来自System.Object,包括控件,BCL类和用户定义的类,因为它位于类型层次结构的根目录中。

答案 1 :(得分:2)

第一个原因是这种设计早于仿制药的引入。

但您认为通用方法会是什么样子?在WinForms中,OnClick事件可以由Button和MenuItem触发。 MenuItem甚至不是控件。

此事件签名用于整个.NET库,因此 sender 可以是任何东西,而不仅仅是Control或其他GUI元素。最常见的是...... System.Object

你必须输入。

答案 2 :(得分:2)

强类型发件人在继承层次结构方面效果不佳。

public class Base
{
  public event EventHandler<Base,MyEventArgs> MyEvent;
}

public class Derived:Base
{

}

现在您想要Derived订阅MyEvent。您的发件人只会是Base。可以用new解决这个问题,但这很难看。