为什么.NET事件具有类型为object而不是类型为T的sender参数

本文关键字:类型 参数 sender object 事件 NET 为什么 | 更新日期: 2023-09-27 18:05:47

可能的重复:
在C#事件处理程序中;发送者";参数是对象吗
中的事件签名。NET;使用强类型';发件人';?

为什么所有的活动都在。NET的第一个参数是类型object,而不是泛型类型T?每次我必须得到我的发件人时,我都必须将其类型转换为更派生的类型。例如:

(Button)sender

为什么.NET事件具有类型为object而不是类型为T的sender参数

因为事件处理程序方法的通用签名早在泛型被添加到语言中之前就已经发明了。

在泛型出现之前,使用System.Object是合乎逻辑的选择,因为它确实是可用的最"泛型"的对象。所有其他对象最终都派生自System.Object,包括控件、BCL类和用户定义的类,因为它位于类型层次结构的根。

强类型发送方不能很好地使用继承层次结构。

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

现在您想在Derived上订阅MyEvent。您的发件人将仅为Base。人们可以用new来解决这个问题,但这会变得很难看。

第一个原因是这个设计早于泛型的引入。

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

此事件签名在中始终使用。NET库,所以sender实际上可以是任何东西,而不仅仅是Control或其他GUI元素。mos公共类是。。。System.Object

您必须键入cast。