嗯,这很有趣……
您可以使用兼容类型的方法组转换绑定事件处理程序:
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 的参考转换可用。这不像是一个继承另一个。
它与泛型协变/逆变更加混淆,但我们暂时将其留在那里......希望这能给你一些东西来咀嚼和解决这些限制的选项。