Это связано с тем, как работают массивы и генерики. У вас есть переменная, набранная так:
IEnumerable<SomeSpecificClass>
Откуда вы знаете, что SomeSpecificClass
всегда наследуется от SomeClass
. Вы хотите добавить все элементы в этой последовательности в List<SomeClass>
, используя AddRange()
. Но List<SomeClass>.AddRange
является конкретным; он хочет точно IEnumerable<SomeCass>
, и вы не можете напрямую разыграть от IEnumerable<SomeSpecificClass>
до IEnumerable<SomeClass>
. Вы можете исправить это с помощью простого Cast<T>()
:
someList.AddRange(items.Cast<SomeClass>());
Теперь вопрос в том, почему массив работает, и ответ таков, что массивы являются особенными в этом смысле. Они больше, чем просто дженерики. Вы можете напрямую привести SomeSpecificClass[]
к SomeClass[]
, а поскольку SomeClass[]
реализует IEnumerable<SomeClass>
, все уже в порядке.