Можно сделать 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
Во-вторых, изменение элемента фактически изменит коллекцию.
В первом случае мы можем просто присвоить элемент другой переменной, а затем поиграть с ней, чтобы не было потерь. В последнем случае это одновременно запрещено (или, по крайней мере, вы не можете ожидать изменения коллекции во время итерации по ней, хотя это не должно применяться принудительно) всеми счетчиками) и во многих случаях невозможно обеспечить (в зависимости от характера перечислимого).
Даже если мы считаем первый случай «правильной» реализацией, тот факт, что он может быть разумно интерпретирован людьми двумя разными способами, является достаточно веской причиной, чтобы не допускать его, особенно учитывая, что мы можем легко обойти это в любом случае. .
person
Jon Hanna
schedule
20.10.2011
this = value
? - person jv42   schedule 20.10.2011