使用foreach的约束
①使用 foreach , 必须在被 foreach in对象类 中实现
GetEnumerator 方法(继承IEnumerable) 。
②foreach 语句是对枚举数的包装,它只允许从集合中读取,不允许写入集合。
③foreach 内部,不允许更改 foreach in对象 中的集合。
问题
ArrayList arr = new ArrayList();
arr.Add("123");
arr.Add("456");
arr.Add("789");
foreach (string str in arr)
{
arr.Remove("789");
Console.WriteLine(str);
}
以上代码当便利ArrayList中的第二个对象时,会引发InvalidOperationException异常。
分析
当使用 foreach 时,首先调用被遍历对象的 GetEnumerator 方法,返回一个Enumerator ,
然后 foreach 将对这个返回的枚举数进行遍历。
个人感觉 foreach 实际做的操作就是:
IEnumerator enumArr = arr.GetEnumerator();
while (enumArr.MoveNext())
{
set.Remove("789");
System.Console.WriteLine(enumArr.Current);
}
而MSDN上有如下说明:
”只要集合保持不变,枚举数就将保持有效。
如果对集合进行了更改(例如添加、修改或删除元素),
则该枚举数将失效且不可恢复,并且下一次对 MoveNext 或 Reset 的调用将引发
InvalidOperationException。”
所以发生了上面问题中的代码发生了异常。