Обработчики событий и ковариация

Я пытался создать общее событие. В основном это должно выглядеть так:

namespace DelegateTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var lol = new SomeClass();
            lol.SomeEvent += handler;
        }

        static void handler(object sender, SomeDerivedClass e)
        {

        }

    }

    class SomeClass
    {

        public delegate void SomeEventDelegate<in T>(object sender, T data);
        public event SomeEventDelegate<ISomeInterface> SomeEvent;

    }

    interface ISomeInterface
    {
    }

    class SomeDerivedClass : ISomeInterface
    {
    }
}

Я хочу разрешить пользователю передавать любой делегат, второй параметр которого получен из "ISomeInterface".

«in» указывает на противоречие, верно? Это означает, что если API ожидает чего-то более общего, вы можете передать ему что-то более конкретное (в моей базе «ISomeInterface» будет общим, а мой «SomeDerivedClass» будет конкретным). Однако мой компилятор сообщает, что «перегрузка для обработчика метода не соответствует DelegateTest.SomeClass.SomeEventDelegate».

Мне интересно, почему это не работает. Какие проблемы были бы вызваны, если бы это было так? Или я что-то упускаю, чтобы он работал?

Заранее спасибо!

6
задан haiyyu 31 March 2012 в 14:11
поделиться