static void HandleDemoEvent(object sender, EventArgs e)
{
Console.WriteLine("bla-bla");
}
static void Main(string[] args)
{
EventHandler handler;
MouseEventHandler mouseHandler;
handler = HandleDemoEvent; //Line#1 - Compile OK
mouseHandler = HandleDemoEvent; //Line#2 - Compile OK
mouseHandler = handler; //Line#3 Compile Error 1 Cannot implicitly convert type 'System.EventHandler' to 'System.Windows.Forms.MouseEventHandler'
}
EventHandler
委托类型和我自己的HandleDemoEvent
方法都具有相同的方法签名。然而,第2行编译精细(在游戏中的逆变),但第3行失败,失败的隐式类型转换错误。一个简单的例子,我直观地理解为什么编译错误发生在第3行,但我无法通过某种形式的解释在我的脑海中解决它。任何人都可以提出一个很好的理解来解释这种差异吗?
答案 0 :(得分:3)
委托共同/逆变仅适用于您从方法构建委托时,如前两种情况。
当您将一个委托分配给另一个委托时,它不起作用,就像您在上一个案例中一样。 (除非您使用通用delgates,在这种情况下,您可以使用通用参数的共同/逆变。)
EventHandler
不是MouseEventHandler
- 但两者都可以采用void
方法包含object
和EventArgs
。