Ну, это интересно ...
Вы можете связать обработчик событий, используя преобразование группы методов с совместимыми типами:
public void GenericHandlerMethod(object sender, EventArgs e) {}
...
// Valid
foo.FormClosingEvent += GenericHandlerMethod;
Это фактически создастэкземпляр FormClosingEventHandler
, не EventHandler
.
Однако вы не можете напрямую подписаться с существующим делегатом типа EventHandler:
EventHandler genericHandler = GenericHandlerMethod;
// Invalid
foo.FormClosingEvent += genericHandler;
... но вы можете создать нового делегата на основе существующего, если типы совместимы:
EventHandler generic = GenericHandlerMethod;
FormClosingEventHandler closingHandler = new FormClosingEventHandler(generic);
// Valid
foo.FormClosingEvent += closingHandler;
В основном вам нужно помнить, что весь синтаксический сахар фактически вызывает метод, подобный этому:
foo.AddFormClosingHandler(handler);
, где метод имеет сигнатуру:
public void AddFormClosingHandler(FormClosingHandler handler)
Теперь помните, что хотя они имеют совместимые сигнатуры, естьнет справочного преобразования, доступного от EventHandler
до FormClosingHandler
.Это не то, что одно наследуется от другого.
Это становится еще более запутанным с общей ковариацией / контравариантностью, но мы оставим это здесь пока ... надеюсь, что это даст вам что-то, что можно пережевать и варианты работывокруг ограничений.