c# - 集合被修改;枚举操作可能无法执行 - 为什么?

标签 c# .net enumeration

我正在枚举一个实现 IList 的集合,并且在枚举期间我正在修改该集合。我收到错误消息,“集合已修改;枚举操作可能无法执行。”

我想知道为什么在迭代过程中修改集合中的项目时会出现此错误。我已经将我的 foreach 循环转换为 for 循环,但我想知道为什么会出现此错误的“详细信息”。

最佳答案

来自IEnumerable documentation :

An enumerator remains valid as long as the collection remains unchanged. If changes are made to the collection, such as adding, modifying, or deleting elements, the enumerator is irrecoverably invalidated and its behavior is undefined.

我认为做出此决定的原因是无法保证所有类型的集合都可以承受修改并仍然保留枚举器状态。考虑一个链表——如果您删除一个节点并且枚举器当前位于该节点上,则节点引用可能是它的唯一状态。一旦该节点被删除,“下一个节点”引用将被设置为 null,有效地使枚举器状态无效并阻止进一步的枚举。

由于某些集合实现在这种情况下会遇到严重问题,因此决定使 IEnumerable 接口(interface)的这一部分成为契约。在某些情况下允许修改而在其他情况下不允许修改会非常困惑。此外,这意味着当集合实现更改时,可能依赖于在枚举集合时修改集合的现有代码会出现严重问题。因此,最好使所有可枚举对象的行为保持一致。

关于c# - 集合被修改;枚举操作可能无法执行 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4536090/

相关文章:

c# - 当 .Net Thread 没有名称时,如何使用 NLog 打印 threadid 而不是 threadname?

c# - .Net Nest Elastic搜索-如何使用文档获取索引名称

.net - IronRuby - .NET 4.0 - 方法名称末尾的问号和感叹号

java - 我对枚举感到困惑

c++ - 关于枚举和按位运算

c# - 在 .Net Core AppSettings/配置中处理带句点的键名

c# - 可以在遍历列表时修改列表吗?

c# - 为什么要将子类对象赋值给父类引用变量?

c# - Visual C# 读取 RFID 卡时按键检测异常(添加 D 字符)

c# - c# 中的通用枚举字符串值解析器?