Тип 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".
EDIT
Я постоянно забываю, что 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;
}