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