В .NET ссылочные типы массивов являются ко-вариантами. Это считается ошибкой. Однако я не понимаю, почему это так плохо, учитывая следующий код:
string[] strings = new []{"Hey there"};
object[] objects = strings;
objects[0] = new object();
Ох, это компилируется и будет терпеть неудачу во время выполнения. Поскольку мы пытались вставить объект в строку []. Хорошо, я согласен, что воняет, но T [] расширяет массив и также реализует IList
(и IList<T>
, интересно, реализует ли он IList<BaseType>
... > . И Array, и IList позволяют нам сделать тот же ужас ошибка.
string[] strings = new []{"Hey there"};
Array objects = strings;
objects.SetValue(new object(),new[]{0});
Версия IList
string[] strings = new []{"Hey there"};
IList objects = strings;
objects[0] = new object();
Классы T [] генерируются CLR и должны включать проверку типа на эквивалент метода set_Item
(в массивах на самом деле нет).
Является ли проблема, связанная с тем, что установка T [] должна выполнять проверку типа во время выполнения (что нарушает безопасность типа, которую вы ожидаете во время компиляции)? Почему считается, что массивы могут проявлять это свойство, когда есть эквивалентные средства для стрельбы в ногу через предоставленные средства выше?