Рассмотрим следующий общий интерфейс 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-array-covariance.aspx).
Я не понимаю, почему проверка типа, которая происходит при назначении слота массива, не учитывает ковариацию.