ITest
共変型パラメーター、インターフェースを実装するT
ジェネリック クラス、およびクラスとサブクラスを持つジェネリック インターフェイスに従うことを検討してください。Test
A
B
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 )。
配列スロットが割り当てられたときに行われる型チェックで、共分散が考慮されていない理由がわかりません。