考虑以下代码:
List<int> list = new List<int>();
IEnumerable<int> enumerable = list;
IEnumerator<int> enumerator = enumerable.GetEnumerator();
list.Add(1);
bool any = enumerator.MoveNext();
在运行时,最后一行抛出:
InvalidOperationException: Collection was modified; enumeration operation may not execute.
我了解 IEnumerators
需要在 IEnumerable
更改时抛出“集合已修改”异常,但我不明白这一点:
为什么 IEnumerator
在 第一次 调用 MoveNext()
时抛出这个异常?由于 IEnumerator
直到第一次调用 MoveNext()
才代表 IEnumerable
的状态,为什么不能启动跟踪第一个 MoveNext()
而不是 GetEnumerator()
的更改?
最佳答案
可能是因为规则“如果基础集合被修改则枚举器无效”比规则“如果基础集合在第一次调用 MoveNext 后修改则枚举器无效”更简单。或者这只是它的实现方式。此外,假设枚举器代表创建枚举器时基础集合的状态是合理的,依赖不同的行为可能是错误的来源。
关于c# - Enumerator.MoveNext() 在第一次调用时抛出 'Collection was Modified',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287185/