18

ITest共変型パラメーター、インターフェースを実装するTジェネリック クラス、およびクラスとサブクラスを持つジェネリック インターフェイスに従うことを検討してください。TestAB

interface ITest<out T> 
{    
  T prop{ get;}
}
class Test<T> : ITest<T>
{    
    public T prop{ get {
       return default(T);    
    }}
}
class A {    
}
class B: A {    
}

次のコードはエラーなしでコンパイルされますが、実行時例外がスローされますSystem.ArrayTypeMismatchException

ITest<A>[] a = new ITest<A>[1];
a[0] = new Test<B>(); //<-- throws runtime exception

しかし、このコードは問題なく動作します:

ITest<A> r = new Test<B>();

Mono 2.10.2これは( )でテストされていますUnity3d 4.1。これは、配列の壊れた共分散に何らかの形で関連していると思います ( http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-を参照)。配列-covariance.aspx )。

配列スロットが割り当てられたときに行われる型チェックで、共分散が考慮されていない理由がわかりません。

4

1 に答える 1