Блог переехал. Актуальная версия поста находится по адресу: http://aakinshin.net/ru/blog/dotnet/list-version-side-effect/.
Если вы делаете foreach по некоторому List-у, то менять итерируемый лист внутри цикла крайне не рекомендуется, ведь это верный способ получить InvalidOperationException. А теперь загадка: как думаете, что случится со следующим кодом:
var list = new List<int> { 0, 1, 2 };
foreach(var x in list)
{
if (x == 0)
{
for (int i = int.MinValue; i < int.MaxValue; i++)
list[0] = 0;
list.Add(3);
}
Console.WriteLine(x);
}
Правильный ответ: этот код замечательно отработает.