Почему List .ForEach позволяет изменять свой список?

Если я использую:

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 для универсального списка, повторяющегося бесконечно )

91
задан Community 23 May 2017 в 11:58
поделиться