在.NET 4.0中的Co-和Contravariance错误
- 论坛
- 在.NET 4.0中的Co-和Contravariance错误
15 浏览
在.NET 4.0中的Co-和Contravariance错误
C# 4.0对于协变和逆变的支持有一些奇怪的行为:
using System; class Program { static void Foo(object x) { } static void Main() { Actionaction = _ => { }; // C# 3.5支持静态协变和逆变方法组转换为委托类型,所以这是完全合法的: action += Foo; // 由于C# 4.0对于接口和委托的协变和逆变更好的支持,这也应该是合法的: action += new Action
结果是ArgumentException: 委托必须是相同类型。
奇怪,不是吗?为什么运行时的Delegate.Combine()
(在执行委托的+=
操作时被调用)不支持协变和逆变?
此外,我发现BCL的System.EventHandler
委托类型没有在其泛型TEventArgs
参数上有逆变注释!为什么?这是完全合法的,TEventArgs
类型只在输入位置使用。也许没有逆变注释是因为这样可以很好地隐藏了Delegate.Combine()
的错误?😉
p.s. 所有这些都影响VS2010 RC和以后的版本。