この魔法のインターフェースを考えると:
public interface IHat<out TRabbit>
{
TRabbit Take();
}
そして、このクラス階層:
public class Rabbit { }
public class WhiteRabbit : Rabbit { }
これでコンパイルできます:
IHat<WhiteRabbit> hat1 = null;
IHat<Rabbit> hat2 = hat1;
これは素晴らしいことです。しかし、インターフェースを別の方法で定義するとどうなりますか?
public interface IHat<out TRabbit>
{
bool Take(out TRabbit r);
}
別のブール値の戻り値を使用して、帽子が空である可能性があることを示しています(以前のバージョンでは、空の帽子からnullのウサギが返された可能性があります)。しかし、私はまだウサギを出力しているだけなので、以前のバージョンと論理的に異なることは何もしていません。
CTPのC#4.0コンパイラでは、インターフェイス定義にエラーが発生します。「out」メソッドパラメータが不変型である必要があります。これが許可されない理由はありますか、それとも将来のバージョンで対処される可能性がありますか?