Использование ReadOnlyCollection<T>
. Он доступен только для чтения и, вопреки вашему мнению, имеет индексатор.
Массивы не являются неизменяемыми, и их невозможно создать без использования оболочки типа ReadOnlyCollection<T>
.
Обратите внимание, что создание оболочки ReadOnlyCollection<T>
является операцией O (1) и не приводит к снижению производительности.
Обновление
Другие ответы предлагали просто привести коллекции к более новому IReadOnlyList<T>
, что расширяет IReadOnlyCollection<T>
для добавления индексатора. К сожалению, это фактически не дает вам контроля над изменчивостью коллекции, поскольку она может быть возвращена к исходному типу коллекции и видоизменена.
Вместо этого вы все равно должны использовать ReadOnlyCollection<T>
(метод List<T>
AsReadOnly()
или Array
s статический метод AsReadOnly()
помогает обернуть списки и соответственно) для создания неизменяемого доступа к коллекции и последующего ее предоставления либо напрямую, либо в качестве любого из поддерживаемых интерфейсов, включая IReadOnlyList<T>
.