Что ж, интересно ...
Вы можете связать обработчик событий с помощью преобразования группы методов с совместимыми типами:
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
недоступно. Не похоже, что одно наследуется от другого.
Это становится еще более запутанным с общей ковариацией / контравариантностью, но мы пока оставим это там ... надеюсь, это дало вам что-то, над чем можно подумать, и варианты для обхода ограничений.
person
Jon Skeet
schedule
23.03.2011