>
>
>
V3221. Modifying a collection during it…


V3221. Modifying a collection during its enumeration will lead to an exception.

Анализатор обнаружил, что коллекция модифицируется во время итерации по ней. Это может привести к возникновению исключения InvalidOperationException.

Рассмотрим пример:

public void AppendMissingNames(List<string> currentNames, 
                               List<string> otherNames)
{
  foreach(string name in currentNames)
  {
    if (!otherNames.Contains(name))
    {
      currentNames.Add(name);
    }
  }
}

В теле foreach вызывается метод Add для коллекции currentNames. Итерирование происходит по этой же коллекции. Модификация currentNames приведёт к возникновению исключения InvalidOperationException.

Исправленный код может выглядеть следующим образом:

public void AppendMissingNames(List<string> currentNames, 
                               List<string> otherNames)
{
  foreach(string name in currentNames)
  {
    if (!otherNames.Contains(name))
    {
      otherNames.Add(name);
    }
  }
}

Вместо currentNames отсутствующие имена должны добавляться в otherNames. В данном случае коллекция, по которой происходит итерирование, не модифицируется.

Рассмотрим пример итерирования по коллекции с помощью метода ForEach:

collection.ForEach(name => { collection.Add(name); });

Ошибка эквивалентна предыдущей: модифицируется коллекция, по которой происходит итерирование. Для исправления изменим коллекцию, в которую будут добавляться элементы:

collection.ForEach(name => { collectionForAppend.Add(name); });