Я знаю, что в .NET все массивы происходят из System.Array и что класс System.Array реализует IList
, ICollection
и IEnumerable
. Фактические типы массивов также реализуют IList<T>
, ICollection<T>
и IEnumerable<T>
.
Это означает, что если у вас есть, например, String[]
, то этот объект String[]
также является System.Collections.IList
и System.Collections.Generic.IList<String>
;.
Не трудно понять, почему эти IList считаются "ReadOnly", но на удивление...
String[] array = new String[0];
Console.WriteLine(((IList<String>)array).IsReadOnly); // True
Console.WriteLine(((IList)array).IsReadOnly); // False!
В обоих случаях попытки удалить элементы с помощью методов Remove()
и RemoveAt()
приводят к исключению NotSupportedException. Это предполагает, что оба выражения соответствуют спискам ReadOnly, но свойство IList ReadOnly
не возвращает ожидаемое значение.
Как получилось?