Это можно сделать изменяемым item
. Мы могли бы изменить способ создания кода так, чтобы:
foreach (var item in MyObjectList)
{
item = Value;
}
Стало эквивалентно:
using(var enumerator = MyObjectList.GetEnumerator())
{
while(enumerator.MoveNext())
{
var item = enumerator.Current;
item = Value;
}
}
И тогда он скомпилируется. Однако это не повлияет на коллекцию.
И есть руб. Код:
foreach (var item in MyObjectList)
{
item = Value;
}
У человека есть два разумных способа думать об этом. Во-первых, item
является просто заполнителем, и его изменение ничем не отличается от изменения item
в:
for(int item = 0; item < 100; item++)
item *= 2; //perfectly valid
Другое дело, что изменение предмета фактически изменит коллекцию.
В первом случае мы можем просто присвоить элемент другой переменной, а затем поиграть с этим, чтобы не было потерь. В последнем случае и то, и другое запрещено (или, по крайней мере, вы не можете ожидать, что изменит коллекцию во время итерации по ней, хотя не имеет , которую должны применять все счетчики) и во многих случаях невозможно предоставить (в зависимости от характера перечисляемого).
Даже если мы считаем первый случай «правильной» реализацией, тот факт, что он может быть разумно истолкован людьми двумя различными способами, является достаточно веской причиной, чтобы не допустить его, особенно учитывая, что мы можем легко обойти это. в любом случае.