事件属性的逆变问题

时间:2010-08-28 04:01:02

标签: events properties c#-4.0 contravariance

假设我有一个简单的EventArgs子类:

class MyArgs : EventArgs { }

考虑我有两个关于事件的类:

class MyData {
    public event EventHandler<MyArgs> Method;
}

class MyObject {
    public event EventHandler Method;
}

一个使用它们的简单程序:

    static void Main(string[] args){

        MyObject o = new MyObject();
        o.Method += MyMethod;

        MyData data = new MyData();
        data.Method += MyMethod;

    }

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

由于Contravariance,MyMethod同时被视为EventHandler和EventHandler&lt; MyArgs&gt;。但是,如果我将MyObject的事件处理程序更改为将方法转发到MyData的属性:

class MyObject {

    MyData data = new MyData();

    public event EventHandler Method {
        add { data.Method += value; }
        remove { data.Method += value; }
    }

}

event属性无法将EventHandler转发给EventHandler。这对我来说似乎很奇怪,因为它似乎属于逆变类别 - 具有较弱签名(基类)的处理程序应该能够接受具有更强签名(子类)的参数。

为什么C#不允许我这样做?有没有办法将通用EventHandler通过事件属性向下传递到EventHandler?是否可以对代表进行某种合法演员表?

1 个答案:

答案 0 :(得分:1)

没有从EventHandlerEventHandler<T>的隐式转换。但是由于两者都是相互兼容的类型,你可以将EventHandler传递给构造函数来“转换”它。

public event EventHandler Method
{
    add { data.Method += new EventHandler<MyArgs>(value); }
    remove { data.Method -= new EventHandler<MyArgs>(value); }
}