EventHandler委托接受具有以下签名的方法,但实现EventHandler的事件不接受

时间:2010-02-12 18:37:49

标签: c# .net

假设我们声明了一个类 DerivedEventArgs

public class DerivedEventArgs : EventArgs { ... }

然后 EventHandler 委托能够接受具有以下签名的方法:

public static void Some_Method(object o, DerivedEventArgs e) { ... }

但是如果我们尝试将具有上述签名的方法订阅到实现EventHandler委托的事件:

public event EventHandler MyEvent;

,然后我们收到错误。那是为什么?

感谢名单

4 个答案:

答案 0 :(得分:2)

假设引发事件的代码指定了一个不是 a DerivedEventArgs的值 - 您期望它做什么?基本上你会失去类型安全。

编辑请注意,可以以相反的方式执行此操作 - 您可以使用更少的方法订阅具有更具体的参数类型的事件特定的参数类型 - 因为事件仍然保证它将使用兼容的东西调用处理程序。这是一个例子:

using System;

class Test
{
    public class DerivedEventArgs : EventArgs { }

    public EventHandler<DerivedEventArgs> SpecialistEvent;

    static void Main()
    {
        Test t = new Test();
        t.SpecialistEvent += GeneralHandler;
    }

    static void GeneralHandler(object sender, EventArgs e)
    {
    }
}

答案 1 :(得分:2)

MyEvent(this, EventArgs.Empty)

会尝试将常规EventArgs传递给

中的DerivedEventArgs
Some_Method(object o, DerivedEventArgs e) 

然后如果Some_Method试图做

e.PropertyInDerivedClass

它失败了。

答案 2 :(得分:2)

尝试为您的活动使用EventHandler<T>,其中T是您的DerivedEventArgs课程。

答案 3 :(得分:0)

来自MSDN EventHandler documentation ...

  

EventHandler是一个预定义的委托,专门表示不生成数据的事件的事件处理程序方法。如果您的事件确实生成了数据,则必须提供自己的自定义事件数据类型,并创建一个委托,其中第二个参数的类型是您的自定义类型,或者使用通用的EventHandler&lt; TEventArgs&gt;委托类并将自定义类型替换为泛型类型参数。

EventHandler委托并不是为了做你想做的事。它是一个简单的便捷委托,用于事件数据不重要的情况。利用此委托类型的事件可以发送具有最少派生事件参数类型的EventArgs。这意味着您的代表应准备好接收任何内容。

但在您的示例中,您在处理程序中指定了更多派生的事件参数类型。因此,如果编译器允许,您的代码实际上可以接收另一个EventArgs类型,该类型不是您所期望的,而是定义为派生类型;如前所述,打破了类型安全。