众所周知,您不能像
InvalidOperationException
那样修改 foreach 循环内的集合。
但是 foreach 循环如何检查任何更改?
我的意思是,如果我有这个代码:
foreach(var item in List<int> list) {
list.Add(5);
list.Remove(5);
}
...它仍然抛出异常。
IEnumerator
界面中没有任何集合的版本控制。那么这是如何运作的呢?
我要求这个是因为在java中你可以在循环期间轻松修改集合,这是我自己的
HashCollection<T>
实现中的问题,我不知道如何检查任何集合更改。
好的我找到了答案
public class List<T> {
...
public struct Enumerator : IEnumerator<T>, System.Collections.IEnumerator
{
private List<T> list;
private int index;
private int version; // there it is
private T current;
internal Enumerator(List<T> list) {
this.list = list;
index = 0;
version = list._version;
current = default(T);
}
...
列出了我在java中不能做的事情的内部结构。也许我应该声明 open
Version
属性并在 Enumerator 中传递集合。