CLR不支持协变返回类型,而它支持.NET 2.0以上的委托/接口通用差异。
换句话说,它不是真的取决于C#团队,而是CLR团队。
至于为什么CLR不支持正常的方差 - 除了增加复杂度外,我不确定,大概没有必要的感知效益。
编辑:为了对抗约返回类型协方差的点,从CLI规范的部分8.10.4,谈到虚表“槽”:
对于被标记 “期望现有时隙中的每个新的构件“,查看 是否有完全匹配的种类(即字段或 方法),名称和签名是否存在 并使用该槽如果找到,则返回 否则分配新槽。
从分区II,第9.9节:
具体地,为了确定 是否构件兽皮(静态或 实例成员)或覆盖(对于 虚拟方法)从一个构件基类 类或接口,只需用 替换每个泛型参数与它的 一般参数,然后比较产生的成员签名即 。
没有迹象表明比较是以允许差异的方式完成的。
如果您认为CLR 确实允许允许有差异,我认为考虑到上面的证据,您可以用一些适当的IL证明它。
编辑:我只是试图它在IL,它不起作用。编译此代码:
using System;
public class Base
{
public virtual object Foo()
{
Console.WriteLine("Base.Foo");
return null;
}
}
public class Derived : Base
{
public override object Foo()
{
Console.WriteLine("Derived.Foo");
return null;
}
}
class Test
{
static void Main()
{
Base b = new Derived();
b.Foo();
}
}
运行它,与输出:
Derived.Foo
拆解:
ildasm Test.exe /out:Test.il
编辑Derived.Foo
拥有的 “串” 的返回类型,而不是 “对象” :
.method public hidebysig virtual instance string Foo() cil managed
R的ebuild:
ilasm /OUTPUT:Test.exe Test.il
重新运行它,与输出:
Base.Foo
换句话说,Derived.Foo不再跨越Base.Foo至于CLR而言。
当然,这个实现也会失败,因为get没有主体,但是对于这个简单的例子,请忽略这个事实;-) – 2009-08-09 11:22:05
Dup:http://stackoverflow.com/questions/837134/why-does-c-clr -not-support-method-override-co-contra-variance – thecoop 2009-08-09 17:27:26
thecoop,我发现自己,所以我已经给我的投票结束这个问题。 – 2009-08-09 18:29:44