Основная проблема заключается в том, что System.Array
нарушает принцип замещения, реализуя IList<T>
. Тип System.Array
имеет фиксированный размер, который нельзя изменить. Метод Add в IList<T>
предназначен для добавления нового элемента в базовую коллекцию и увеличения его размера на 1. Это невозможно для System.Array
и, следовательно, он выбрасывает.
То, что System.Array
действительно хочет реализовать здесь, это стиль только для чтения IList<T>
. К сожалению, в фреймворке такого типа не существует, и поэтому он реализует следующую лучшую вещь: IList<T>
.
Что касается вопроса о том, какие типы присваиваются IList<T>
, на самом деле их довольно много, включая: ReadOnlyCollection<T>
и Collection<T>
. Список слишком длинный, чтобы положить сюда. Лучший способ увидеть все это - открыть IList<T>
в отражателе и найти производные типы IList<T>
.