次の小さな LINQPad の例を見てください。
void Main()
{
Foo<object> foo = new Foo<string>();
Console.WriteLine(foo.Get());
}
class Foo<out T>
{
public T Get()
{
return default(T);
}
}
次のエラーでコンパイルに失敗します。
差異修飾子が無効です。バリアントとして指定できるのは、インターフェイスおよびデリゲート型パラメーターのみです。
コードに論理的な問題は見られません。すべてを静的に検証できます。これが許可されないのはなぜですか?言語に矛盾が生じるのでしょうか、それとも CLR の制限のために実装するにはコストがかかりすぎると考えられたのでしょうか? 後者の場合、開発者として、上記の制限について何を知っておく必要がありますか?
インターフェイスがそれをサポートしていることを考えると、クラスのサポートが論理的にそれに続くと予想していました。