为何foreach中修改数组正常,修改List集合却报错?
为什么foreach中修改数组元素正常,修改List元素却报错?
首先纠正你代码里的编译错误:List示例中的isimler[index] += 10会报错,因为string不能直接和int相加,改成isimler[index] += "10"才能正常编译。如果修正后你仍遇到运行时异常,核心原因在于数组和List<T>的迭代器实现逻辑完全不同:
数组的迭代器无修改检测
数组是固定长度的集合,它的迭代器是个轻量级结构体,只负责按索引遍历元素,不会跟踪数组的任何修改状态。因为数组根本没法做结构修改(比如添加、删除元素),所以哪怕你在foreach遍历(不管是遍历数组本身,还是基于数组生成的Select序列)时修改元素值、替换元素引用,都不会触发任何异常——迭代器只关心索引是否越界,不检查元素内容的变化。
List的迭代器只禁止结构修改
List<T>的迭代器会维护一个内部版本号,当List发生结构修改(比如添加/删除元素、调整容量、重新排序元素)时,版本号会自动递增。迭代器每次迭代都会对比当前集合的版本号和自己初始化时的版本号,一旦不匹配就抛出InvalidOperationException,避免遍历过程中集合结构变化导致的不确定行为。
但要注意:修改现有元素的值(比如替换string引用、更新值类型字段)不属于结构修改,这种操作不会触发版本检查,也不会报错。如果你遇到了运行时异常,大概率是在遍历List本身的foreach循环中做了结构修改(比如调用Add/Remove),而非单纯修改元素值。
内容的提问来源于stack exchange,提问作者Ekin Ekin
相关产品推荐
相关产品推荐

