Es sería ser posible hacer item
mutable. Podríamos cambiar la forma en que el código se produce de manera que:
foreach (var item in MyObjectList)
{
item = Value;
}
Se convirtió en equivalente a:
using(var enumerator = MyObjectList.GetEnumerator())
{
while(enumerator.MoveNext())
{
var item = enumerator.Current;
item = Value;
}
}
y sería entonces compilar. Sin embargo, no afectaría la colección.
Y ahí está el problema. El código:
foreach (var item in MyObjectList)
{
item = Value;
}
Tiene dos formas razonables para que un ser humano lo piense. Una es que item
es sólo un lugar de titular y cambio que no es diferente a los cambios en item
:
for(int item = 0; item < 100; item++)
item *= 2; //perfectly valid
La otra es que el cambio de tema sería realmente cambiar la colección.
En el primer caso, podemos simplemente asignar un elemento a otra variable, y luego jugar con eso, para que no haya pérdidas. En el último caso, esto está prohibido (o al menos, no puede esperar que altere una colección mientras se itera a través de ella, aunque tiene impuesta por todos los enumeradores) y en muchos casos es imposible proporcionar (dependiendo de la naturaleza del enumerable).
Incluso si consideramos que el primer caso es la implementación "correcta", el hecho de que pueda ser razonablemente interpretado por humanos de dos maneras diferentes es una razón suficiente para evitarlo, especialmente si tenemos en cuenta que podemos trabajar fácilmente eso en cualquier caso.
Creo que significa "debajo del capó", pero en realidad no es lo mismo en absoluto. –
@ GianT971 ¿Podría describir cómo haría 'lo mismo' en su setter? 'this = value'? – jv42
@JonSkeet Yess Under the hood ^^. Ok, el elemento es en realidad una referencia al objeto, y no el objeto en sí, lo tengo ahora – GianT971