在.NET 4.0中的Co-和Contravariance错误

15 浏览
0 Comments

在.NET 4.0中的Co-和Contravariance错误

C# 4.0对于协变和逆变的支持有一些奇怪的行为:

using System;
class Program {
  static void Foo(object x) { }
  static void Main() {
    Action action = _ => { };
    // C# 3.5支持静态协变和逆变方法组转换为委托类型,所以这是完全合法的:
    action += Foo;
    // 由于C# 4.0对于接口和委托的协变和逆变更好的支持,这也应该是合法的:
    action += new Action(Foo);
  }
}

结果是ArgumentException: 委托必须是相同类型。

奇怪,不是吗?为什么运行时的Delegate.Combine()(在执行委托的+=操作时被调用)不支持协变和逆变?

此外,我发现BCL的System.EventHandler委托类型没有在其泛型TEventArgs参数上有逆变注释!为什么?这是完全合法的,TEventArgs类型只在输入位置使用。也许没有逆变注释是因为这样可以很好地隐藏了Delegate.Combine()的错误?😉

p.s. 所有这些都影响VS2010 RC和以后的版本。

0