Solo un miembro del equipo de BCL puede decirnos con seguridad, pero probablemente fue solo un descuido que le permite modificar la lista.
En primer lugar, la respuesta de David B no tiene sentido para mí. Es List<T>
, no C#, que comprueba si modifica la lista dentro de un bucle foreach
y arroja un InvalidOperationException
si lo hace. No tiene nada que ver con el idioma que estás usando.
En segundo lugar, hay una advertencia en el documentation:
Modificación de la colección subyacente en el cuerpo de la acción no es compatible <T> delegado y causa un comportamiento indefinido.
No me parece probable que el equipo de BCL haya querido que un método tan simple como ForEach
tenga un comportamiento indefinido.
En tercer lugar, a partir de .NET 4.5, se producirá una InvalidOperationException
si el delegado modifica la lista. Si un programa depende del comportamiento anterior, it will stop working cuando se vuelve a compilar para .NET 4.5. El hecho de que Microsoft esté dispuesto a aceptar este cambio radical sugiere que el comportamiento original no fue intencionado y no se debe confiar en él.
Para referencia, aquí es como se implementa en .NET 4.0, directamente desde la fuente de referencia:
public void ForEach(Action<T> action) {
if(action == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
Contract.EndContractBlock();
for(int i = 0 ; i < _size; i++) {
action(_items[i]);
}
}
Y así es como se ha cambiado en .NET 4.5:
public void ForEach(Action<T> action) {
if(action == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
Contract.EndContractBlock();
int version = _version;
for(int i = 0 ; i < _size; i++) {
if (version != _version && BinaryCompatibility.TargetsAtLeast_Desktop_V4_5) {
break;
}
action(_items[i]);
}
if (version != _version && BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
"Esto abre la posibilidad de que la colección se modifique ". [Exactamente por qué ahora se ha ido de .NET para aplicaciones de estilo Metro.] (Http://stackoverflow.com/questions/10299458/is-the-listt-foreach-extension-method-gone/10299492#10299492) Ho hum . – BoltClock
Eric Lippert (desaprobación) [los comentarios sobre '.ForEach'] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx) siempre merecen una lectura en este contexto. –
por cierto: http://stackoverflow.com/questions/10299458/is-the-listt-foreach-extension-method-gone – user287107