4
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具有相同的方法签名。然而 Line#2 编译得很好(发挥逆变性),但 Line#3 因隐式类型转换错误失败而失败。一个简单的例子,我直观地理解为什么 Line#3 会发生编译错误,但我无法通过某种形式的解释来解决这个问题。任何人都可以提出一个很好的理解来解释差异吗?

4

1 回答 1

3

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

当您将一个代表分配给另一个代表时,它不起作用,就像您的最后一种情况一样。(除非您使用泛型委托,在这种情况下,您可以对泛型参数使用协变/逆变。)

AnEventHandler不是MouseEventHandler- 但两者都可以包装void采用 anobject和 an的方法EventArgs

于 2012-08-14T10:22:28.207 回答