Solo un membro del team BCL può dircelo con certezza, ma probabilmente era solo una svista che è possibile modificare l'elenco da .
In primo luogo, la risposta di David B non ha senso per me. È List<T>
, non C#, che controlla se si modifica l'elenco all'interno di un ciclo foreach
e si genera un InvalidOperationException
se lo si fa. Non ha niente a che fare con la lingua che stai usando.
In secondo luogo, c'è questo avvertimento nel documentation:
Modifica della collezione sottostante nel corpo dell'azione <T> delegato non è supportata e causa un comportamento indefinito.
Trovo improbabile che il team BCL abbia voluto un metodo così semplice come ForEach
per avere un comportamento non definito.
In terzo luogo, come di .NET 4.5, sarà gettare un InvalidOperationException
se il delegato modifica l'elenco. Se un programma dipende dal vecchio comportamento, it will stop working quando viene ricompilato su .NET 4.5 di destinazione. Il fatto che Microsoft sia disposta ad accettare questo cambiamento radicale suggerisce fortemente che il comportamento originale non era intenzionale e non dovrebbe essere invocato.
Per riferimento, ecco come implementata in .NET 4.0, direttamente dalla fonte di riferimento:
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]);
}
}
Ed ecco come è stato cambiato in .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);
}
fonte
2013-05-04 15:20:15
"Questo apre la possibilità che la collezione venga modificata ". [Esattamente il motivo per cui ora è passato da .NET per le app in stile Metro.] (Http://stackoverflow.com/questions/10299458/is-the-listt-foreach-extension-method-gone/10299492#10299492) Ho hum . – BoltClock
I commenti (di disapprovazione) di Eric Lippert [commenti su '.ForEach'] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx) valgono sempre la pena in questo contesto. –
a proposito: http://stackoverflow.com/questions/10299458/is-the-listt-foreach-extension-method-gone – user287107