Чтобы иметь возможность обрабатывать ArraySegment напрямую, как массив, вы должны привести его к IList с помощью «as».Это описывается как правильное поведение здесь:
использование класса ArraySegment?
и здесь:
dotNet ArraySegment Struct
В частности, документ Microsoft гласит:
Если вы хотите извлечь элемент по его индексу в объекте ArraySegment, вы должны привести его к объекту IList и получить или изменить его.используя свойство IList.Item [Int32].В следующем примере извлекается элемент в объекте ArraySegment, который разделяет раздел массива строк.
Недоумение вызывает то, что в IList есть такие методы, как «Remove» и «RemoveAt».Можно ожидать, что они не будут работать с сегментом массива, приведенным в виде списка.Я проверил это, и на самом деле вызов Remove выдает ошибку времени выполнения.Но компилятор не улавливает проблему.
Я удивлен, что Microsoft сочла это приемлемым поведением при разработке ArraySegment.
Я пытался провести мозговой штурм в классе-обертке или каким-то способом скрыть методы List, которые не должны вызываться в ArraySegment, как List.Но я ничего не смог придумать.
У кого-нибудь есть предложения, как это исправить?
РЕДАКТИРОВАТЬ: вместо IList было предложено IReadOnlyList. IReadOnlyListделает список полностью доступным только для чтения, не позволяя вам изменять значение элементов, хранящихся в базовом массиве.Я хочу иметь возможность изменить исходные значения массива.Я просто не хочу иметь возможность писать list.Remove () или list.Add (), поскольку это явно неправильно и компилятор не должен этого допускать.
Всем, кто может предложитьSpan в качестве альтернативы:
Мне известен Span, но в настоящее время Span имеет ограничения в .NET Framework и Standard.В частности, он может использоваться только как локальная переменная и, следовательно, не может быть передан другим методам.
И, честно говоря, я действительно считаю, что IEnumerable Heirarchy от Microsoft оставляет желать лучшего- Я не могу придумать, как создать индексируемую последовательность, такую как List, без функции добавления / удаления.ICollection не поддерживает индексирование.Если у кого-то есть предложения по этому вопросу, я весь слух.