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