考虑以下代码:
List<int> list = new List<int>();
IEnumerable<int> enumerable = list;
IEnumerator<int> enumerator = enumerable.GetEnumerator();
list.Add(1);
bool any = enumerator.MoveNext();
在运行时,最后一行抛出:
我理解
IEnumerators
需要在 IEnumerable
更改时抛出“Collection was modified”异常,但我不明白这一点:为什么
IEnumerator
会在 第一次 调用 MoveNext()
时抛出这个异常?由于在第一次调用 IEnumerator
之前 IEnumerable
不代表 MoveNext()
的状态,为什么它不能从第一个 MoveNext()
而不是从 GetEnumerator()
开始跟踪更改? 最佳答案
可能是因为“如果底层集合被修改,则枚举器将失效”的规则比“如果在第一次调用 MoveNext 后底层集合被修改,则枚举器将失效”的规则更简单。或者这只是它的实现方式。另外,假设 Enumerator 代表 Enumerator 创建时底层集合的状态是合理的,并且依赖不同的行为很可能是错误的来源。