Тип IEnumerable<T>не поддерживает такие операции. Назначение IEnumerable<T>интерфейса - позволить потребителю просматривать содержимое коллекции. Не изменять значения.
Когда вы выполняете такие операции, как .ToList (). Add (), вы создаете новый List<T>и добавляете значение в этот список. Это не имеет никакого отношения к первоначальному списку.
Что вы можете сделать, это использовать метод Add extension, чтобы создать новый IEnumerable<T>с добавленной стоимостью.
items = items.Add("msg2");
Даже в этом случае он не изменит оригинальный IEnumerable<T>объект. Это можно проверить, сохранив ссылку на него. Например
var items = new string[]{"foo"};
var temp = items;
items = items.Add("bar");
После этого набора операций переменная temp по-прежнему будет ссылаться только на перечислимое значение с одним элементом «foo» в наборе значений, в то время как элементы будут ссылаться на другое перечисляемое значение со значениями «foo» и «bar».
РЕДАКТИРОВАТЬ
Я постоянно забываю, что Add не является типичным методом расширения, IEnumerable<T>потому что это один из первых, который я в итоге определил. Вот
public static IEnumerable<T> Add<T>(this IEnumerable<T> e, T value) {
foreach ( var cur in e) {
yield return cur;
}
yield return value;
}
IEnumerable<T>предназначен только для запросов к коллекциям. Это основа для платформы LINQ. Это всегда абстракция какой - то другой коллекции , такие какCollection<T>,List<T>илиArray. Интерфейс предоставляет толькоGetEnumeratorметод, который возвращает экземпляр,IEnumerator<T>который позволяет пройти по расширенной коллекции по одному элементу за раз. Методы расширения LINQ ограничены этим интерфейсом.IEnumerable<T>предназначен только для чтения, поскольку может представлять собой совокупность частей нескольких коллекций.