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); });
Данная диагностика классифицируется как: