Se uso:
var strings = new List<string> { "sample" };
foreach (string s in strings)
{
Console.WriteLine(s);
strings.Add(s + "!");
}
l' Add
nella foreach
genera InvalidOperationException (Collection è stato modificato; operazione di enumerazione non può eseguire), che ritengo logico, dal momento che stiamo tirando il tappeto da sotto i piedi.
Tuttavia, se utilizzo:
var strings = new List<string> { "sample" };
strings.ForEach(s =>
{
Console.WriteLine(s);
strings.Add(s + "!");
});
prontamente si spara nel piede eseguendo un ciclo finché non genera un'eccezione OutOfMemoryException.
Questa è una sorpresa per me, poiché ho sempre pensato che List.ForEach fosse solo un wrapper per foreach
o per for
.
Qualcuno ha una spiegazione per il come e il perché di questo comportamento?
(Ispirato dal ciclo ForEach per un elenco generico ripetuto all'infinito )