c# - Enumerator.MoveNext() 在第一次调用时抛出 'Collection was Modified'

标签 c# .net multithreading iterator ienumerable

考虑以下代码:

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/

相关文章:

asp.net - 如何将分页应用于数据集?

java - 在多个线程中调用相同的API

c# - View 和 View 模型之间的快捷方式(Visual Studio 2012)

c# - System.Activator.CreateInstance 的问题

.net - .NET线程中的这段代码

c# - 如何锁定文件

c - 在 C 中实现 KeyPress 事件

multithreading - 从新线程中处理 ExcelDnaUtil.Application

c# - 为什么我要按位置绑定(bind) OracleCommand 参数?

c# - 更新面板问题或可能的错误