Если я использую:
var strings = new List<string> { "sample" };
foreach (string s in strings)
{
Console.WriteLine(s);
strings.Add(s + "!");
}
Add
в foreach
вызывает исключение InvalidOperationException (коллекция была изменена, операция перечисления может не выполняться), что я считаю логичным, так как мы вытаскиваем коврик из-под ног.
Однако, если я использую:
var strings = new List<string> { "sample" };
strings.ForEach(s =>
{
Console.WriteLine(s);
strings.Add(s + "!");
});
он быстро стреляет в ногу, зацикливая до тех пор, пока не выкинет исключение OutOfMemoryException.
Это для меня как сюрприз, поскольку я всегда думал, что List.ForEach был либо просто оберткой для foreach
, либо для for
.
Кто-нибудь объясняет, как и почему это поведение?
(Inpired by цикл forEach для универсального списка повторяется бесконечно)