2015-03-06 4 views
0

У меня есть два массива объектов. Его неявно бросает ковариация от 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 []?

ответ

1

Нет, невозможно завершить второй бросок. Дисперсия массива зависит от фактического типа самого объекта массива, а не его содержимого. Вы можете использовать массив A[] для object[] из-за типа массива. Обратите внимание, что если вы попытаетесь добавить объекты не A в A[], то как object[], это все еще не выполняется во время выполнения, потому что массив все еще является A[].

Если вы хотите A[] объект, когда все у вас есть это object[] объект, вам нужно будет создать новый объект A[] и скопировать значения из исходного массива в новый.

+0

Таким образом, он хранит внутренне, является ли это A [] после того, как вы передали его объекту []? – Coburn

+0

Да, актер - просто переинтерпретация, а не конверсия. Фактически, в вашем примере массив 'o' фактически ссылается на тот же объект, что и первоначально созданный, и как впоследствии ссылается на' a_2'. То есть 'object.ReferenceEquals (o, a_2)' возвращает 'true'. Другими словами, это не просто «внутренняя» вещь ... все, что делает бросок, это изменение того, как ваш код _statically_ просматривает объект, то есть то, что компилятор C# позволит вам делать с ним во время компиляции. Во время выполнения это точно то же самое. –

0

Использование OfType<T> функция.

... 
var lo = new List<object> {new A(), new A()}; 
var cast = lo.OfType<A>().ToArray(); 
... 
Смежные вопросы