Как получается, что U [] можно преобразовать в T []?

Ясно, что тип массива 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())

6
задан Dan Tao 31 August 2010 в 17:45
поделиться