考虑以下代码:

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 创建时底层集合的状态是合理的,并且依赖不同的行为很可能是错误的来源。

10-08 11:29