Реальная техническая причина в этом сценарии состоит в том, что списки содержат частный член, называемый «версия». Каждая модификация - Добавить / Удалить - увеличивает версию. Перечислитель, возвращающий GetEnumerator, сохраняет версию в момент ее создания и проверяет версию каждый раз, когда вызывается «Далее» - если она не равна, она выдает исключение.
Это верно для встроенного List<T>
класс и, возможно, для других коллекций, поэтому, если вы реализуете свой собственный IList (а не просто подклассифицируете / используете встроенную коллекцию внутри), тогда вы сможете обойти это, но, как правило, перечисление и mofication должны выполняться в обратном порядке для -loop или использовать дополнительный список в зависимости от сценария.
Обратите внимание, что изменение элемента отлично, только добавление / удаление не является.