Проблемы контравариантности со свойствами событий

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


person benjamin.popp    schedule 28.08.2010    source источник


Ответы (1)


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

public event EventHandler Method
{
    add { data.Method += new EventHandler<MyArgs>(value); }
    remove { data.Method -= new EventHandler<MyArgs>(value); }
}
person Jeff Mercado    schedule 28.08.2010
comment
Ха - я об этом не подумал. Я не понимал, что там используются неявные преобразования - спасибо! - person benjamin.popp; 31.08.2010