【问题标题】:Contravariance problems with event properties事件属性的逆变问题
【发布时间】:2010-08-28 04:01:01
【问题描述】:

假设我有一个简单的 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) { }

多亏了逆变,MyMethod 既算作 EventHandler 又算作 EventHandler。但是,如果我将 MyObject 的事件处理程序更改为将方法转发到 MyData 的属性:

class MyObject {

    MyData data = new MyData();

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

}

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

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

【问题讨论】:

    标签: events properties c#-4.0 contravariance


    【解决方案1】:

    没有从EventHandlerEventHandler&lt;T&gt; 的隐式转换。但是,由于两者都是相互兼容的类型,您只需将 EventHandler 传递给构造函数即可“转换”它。

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

    【讨论】:

    • 呵呵——我没想到。我没有意识到它在那里使用隐式转换 - 谢谢!
    猜你喜欢
    • 2020-10-04
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多