Jeśli używam:
var strings = new List<string> { "sample" };
foreach (string s in strings)
{
Console.WriteLine(s);
strings.Add(s + "!");
}
Add
w foreach
rzuca InvalidOperationException (Kolekcja została zmodyfikowana; operacja wyliczania nie może wykonać), które uważam za logiczne, ponieważ jesteśmy pociągając dywanik spod naszych stóp.
Jeśli jednak używam:
var strings = new List<string> { "sample" };
strings.ForEach(s =>
{
Console.WriteLine(s);
strings.Add(s + "!");
});
natychmiast strzela sobie w stopę, wykonując pętlę, aż wyrzuci wyjątek OutOfMemoryException.
Zaskoczyło mnie to, ponieważ zawsze myślałem, że List.ForEach to tylko opakowanie dla foreach
lub dla for
.
Czy ktoś ma wyjaśnienie, jak i dlaczego to zachowanie?
(Zainspirowany pętlą ForEach dla listy ogólnej powtarzanej w nieskończoność )