gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:13:16 25 4
gpt4 key购买 nike

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 委托(delegate)类型和我自己的HandleDemoEvent 方法都具有相同的方法签名。然而,第 2 行编译得很好(逆变在起作用),但第 3 行因失败的隐式类型转换错误而失败。一个简单的例子,我直观地理解为什么第 3 行会出现编译错误,但我无法通过某种形式化的解释来解决这个问题。任何人都可以提出一个很好的理解来解释差异吗?

最佳答案

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

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

一个 EventHandler 不是一个 MouseEventHandler - 但两者都可以包装一个 void 方法接受一个 object 和一个 EventArgs

关于c# - 赋值兼容性、逆变和隐式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11949992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com