CLR は共変の戻り値の型をサポートしていませんが、.NET 2.0 以降ではデリゲート/インターフェイスの一般的な分散がサポートされています。
つまり、実際には C# チームではなく、CLR チームの責任です。
CLR が通常の分散をサポートしない理由については、おそらく必要な量の知覚される利点がなければ、複雑さが増すこと以外はわかりません。
編集: vtable の「スロット」について話している 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
再構築:
ilasm /OUTPUT:Test.exe Test.il
再実行すると、次の出力が得られます。
Base.Foo
つまり、CLR に関する限り、Derived.Foo は Base.Foo をオーバーライドしなくなりました。