У меня есть два массива объектов. Его неявно бросает ковариация от A [] к объекту [], а затем явно отбрасывается без проблем. Другой - это список объектов, в который я добавляю некоторые A и создаю объект [], из которого я пытаюсь использовать A [].Литье двух различных объектов массивов
public class A {}
object[] o = new A[]{new A(), new A()};
A[] a_2 = (A[])o;
List<object> lo = new List<object>();
lo.Add(new A());
lo.Add(new A());
A[] a_1 = (A[])lo.ToArray();
Второй тест не пройден с System.InvalidCastException: Cannot cast from source type to destination type.
я вроде вижу, как это может вызвать исключение, как мы могли бы добавить что-нибудь к списку объектов, тогда как с неявным гипсе, исходный массив должен был все как.
Есть ли способ завершить второй листинг, если список имеет все Как будто A не известно во время компиляции? Почему второй генерирует исключение, так как на поверхности они являются как объектами [], так и A []?
Таким образом, он хранит внутренне, является ли это A [] после того, как вы передали его объекту []? – Coburn
Да, актер - просто переинтерпретация, а не конверсия. Фактически, в вашем примере массив 'o' фактически ссылается на тот же объект, что и первоначально созданный, и как впоследствии ссылается на' a_2'. То есть 'object.ReferenceEquals (o, a_2)' возвращает 'true'. Другими словами, это не просто «внутренняя» вещь ... все, что делает бросок, это изменение того, как ваш код _statically_ просматривает объект, то есть то, что компилятор C# позволит вам делать с ним во время компиляции. Во время выполнения это точно то же самое. –