赋值兼容性,逆变和隐式类型转换

时间:2012-08-14 10:05:19

标签: c# contravariance

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行,但我无法通过某种形式的解释在我的脑海中解决它。任何人都可以提出一个很好的理解来解释这种差异吗?

1 个答案:

答案 0 :(得分:3)

委托共同/逆变仅适用于您从方法构建委托时,如前两种情况。

当您将一个委托分配给另一个委托时,它不起作用,就像您在上一个案例中一样。 (除非您使用通用delgates,在这种情况下,您可以使用通用参数的共同/逆变。)

EventHandler不是MouseEventHandler - 但两者都可以采用void方法包含objectEventArgs