Предположим, у меня есть простой подкласс 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 . Однако, если я изменю обработчик событий 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? Есть ли какие-то юридические акты, которые могут быть выполнены для делегатов?