Чтение здесь , я понимаю, почему это не IList<T>. Но зачем вообще IList? Не имеет смысла добавлять к нему, поэтому он должен быть просто IEnumerable, или, если вы действительно хотите индексатор (без причины), используйте ReadOnlyCollection.
IList<T>
Взгляните на NotifyCollectionChangedEventArgs.
NotifyCollectionChangedEventArgs
Имеет свойства NewStartingIndex и OldStartingIndex.
NewStartingIndex
OldStartingIndex
Так что дизайн основан на индексируемых коллекциях, я полагаю, это удобно, например, для списков.
Индексирование желательно для сценариев виртуализации списков.
IList - это простейший интерфейс коллекции, предоставляющий индексированный доступ к элементам. ReadOnlyCollection - это конкретный класс и, следовательно, более ограничивающий для разработчиков.
IList
ReadOnlyCollection
Я думаю, что в случае INotifyCollectionChanged вам часто нужно выполнить поиск компонентов по их именам (поскольку свойства хранятся там как строки), поэтому важно иметь индексатор, который принимает строки ( и основная структура, вероятно, должна быть чем-то вроде HashTable).
INotifyCollectionChanged
На веб-странице MSDN вы можете найти следующую рекомендацию:
Если у вас есть продвинутый сценарий и вы хотите реализовать свой собственный коллекция, рассмотрите возможность использования IList, который предоставляет неуниверсальный коллекция объектов, к которым можно получить индивидуальный доступ по индексу и обеспечивает лучшую производительность.