作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!