Ясно, что тип массива T []
не является Ковариант в качестве элементов T []
может быть установлен по индексу.
И, тем не менее, U []
может быть приведен к T [ ]
без каких-либо жалоб со стороны компилятора, если U
вытекает из T
.
Man[] men = new[] { new Man("Aaron"), new Man("Billy"), new Man("Charlie") };
Person[] people = (Person[])men;
Из приведенного выше кода видно, что men
и люди
, похоже, имеют ссылку на один и тот же объект Array
. Эффект установки men [0] = new Man («Aidan»)
можно увидеть у людей [0]
. Аналогичным образом пытаются человек [0] = новая женщина ("Дебби" )
приводит к возникновению ArrayTypeMismatchException
во время выполнения *.
Означает ли это, что тип T []
фактически выполняет проверку типа при каждом вызове set
? Кажется, что это должно быть необходимо, если разрешено приводить массивы таким образом.
Я думаю, что мой вопрос просто: Как это возможно? Мне ясно, что U []
не является производным от T []
. Мне также неясно , могу ли я когда-нибудь определить свой собственный тип, который будет работать таким образом: на самом деле будет инвариантным, но актом ковариантным.
* Хотя Дисперсия массива, по-видимому, разрешена CLR , любой язык может запретить приведение между типами массивов. Тем не мение, похоже, что это поведение идентично в VB.NET:
Dim men = New Man() { New Man("Aaron"), New Man("Billy"), New Man("Charlie") }
Dim people = CType(men, Person())