Индексатор реализован с явной реализацией интерфейса, поэтому вы сможете получить к нему доступ только в том случае, если выполните:
IList<int> b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
b[2] = 3;
или
var b = new ReadOnlyCollection<int>(new[] { 2, 4, 2, 2 });
((IList<int>)b)[2] = 3;
Конечно, тогда произойдет сбой во время выполнения ...
Это полностью преднамеренно и полезно - это означает, что когда компилятор знает , что это ReadOnlyCollection
, неподдерживаемые биты функциональности вам недоступны, что помогает отвлечь вас от сбоев во время выполнения .
Хотя это интересный и относительно необычный шаг, эффективно неявно реализующий половину свойства / индексатора, а половину явно.
Вопреки моим предыдущим мыслям, я считаю, ReadOnlyCollection<T>
на самом деле реализует весь индексатор явно, но также предоставляет общедоступный индексатор только для чтения. Другими словами, это примерно так:
T IList<T>.this[int index]
{
// Delegate interface implementation to "normal" implementation
get { return this[index]; }
set { throw new NotSupportedException("Collection is read-only."); }
}
public T this[int index]
{
get { return ...; }
}