Внутри большинство классов базовой коллекции поддерживают номер версии. Всякий раз, когда вы добавляете, удаляете, переупорядочиваете и т. Д. Коллекцию, этот номер версии увеличивается.
Когда вы начинаете перечисление, берется снимок номера версии. Каждый раз вокруг цикла этот номер версии сравнивается с коллекцией, а если они различаются, то это исключение бросается.
Хотя было бы возможно реализовать IList
, чтобы он мог корректно обрабатывать изменения в коллекции, сделанной в , в цикле foreach (с учетом того, что перечислитель отслеживает изменения коллекции), задача гораздо сложнее правильно обрабатывать изменения, внесенные в коллекцию другими потоками во время перечисления. Таким образом, это исключение существует, чтобы помочь выявить уязвимости в вашем коде и обеспечить раннее предупреждение о любых потенциальных неустойчивостях, вызванных манипуляциями с другими потоками.