Проблемы контравариантности со свойствами события - PullRequest
0 голосов
/ 28 августа 2010

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

1 Ответ

1 голос
/ 28 августа 2010

Нет неявного преобразования из EventHandler в EventHandler<T>. Однако, поскольку оба имеют совместимые типы друг с другом, вы можете просто передать EventHandler конструктору, чтобы «преобразовать» его.

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