C# 赋值兼容性、逆变和隐式类型转换

C# 赋值兼容性、逆变和隐式类型转换,c#,contravariance,C#,Contravariance,EventHandler委托类型和我自己的HandleDemoEvent方法都具有相同的方法签名。然而,第2行编译得很好(起作用的是逆变),但第3行由于隐式类型转换错误而失败。这是一个简单的例子,我直观地理解了第#3行发生编译错误的原因,但我无法用某种形式的解释来解决它。任何人都能很好地理解这一区别吗?委托协方差/协方差仅适用于从方法构建委托时,如前两种情况 当您将一个代理分配给另一个代理时,它不起作用,就像在上一个案例中一样。(除非使用通用增量门,否则在这种情况下,可以对通用参数使用协方差/逆

EventHandler
委托类型和我自己的
HandleDemoEvent
方法都具有相同的方法签名。然而,第2行编译得很好(起作用的是逆变),但第3行由于隐式类型转换错误而失败。这是一个简单的例子,我直观地理解了第#3行发生编译错误的原因,但我无法用某种形式的解释来解决它。任何人都能很好地理解这一区别吗?

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

当您将一个代理分配给另一个代理时,它不起作用,就像在上一个案例中一样。(除非使用通用增量门,否则在这种情况下,可以对通用参数使用协方差/逆变。)


EventHandler
不是
MouseEventHandler
——但两者都可以包装一个
void
方法,该方法使用
对象
EventArgs

“委托协方差/反方差仅在从方法构建委托时有效”——我不知道这一点。它解决了这件事,其余的都是琐事。谢谢:)我想重要的是前两行做了一些与最后一行根本不同的事情:)
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'

}