【发布时间】: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
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