Сравните это с полем только для чтения:
private readonly List<int> MyList = new List<int>();
Теперь в этом коде я не могу сделать MyList = new List<int>()
, так как это изменит то, на что указывает MyList
, но я могу изменить список, на который указываетMyList.Add(3)
.
Аналогично, вы не можете изменить переменную, используемую итерацией foreach
, но можете указать, к чему она относится:
foreach(List<int> lst in MyListOfLists)
{
lst = new List<int>(); // not allowed
lst.Add(3); // allowed
}
Наконец, перечислитель, используемый для реализации foreach
необязательно оставаться действительным, если используется базовая коллекция:
foreach(int x in SomeEnumerable)
{
if(x != 0)
SomeEnumerable.Add(0);
}
Если предположить, что Add
изменяет SomeEnumerable
, тогда вышеприведенный может работать, он может "работает" странным и трудным для понимания способом, и может вызвать исключение.С таким кодом поведение не гарантируется, и изменение коллекции во время перечисления считается неправильным по этой причине.