List<T>.GetEnumerator
返回的List<T>.Enumerator
是struct
,因此通过接口传递它将对其进行装箱(因此,后续调用将使用从当前状态复制的不同实例).例如,以下内容:
using(var e = l.GetEnumerator())
{
e.MoveNext();
DoSomethingWith(e);
DoSomethingWith(e);
}
将打印:
True
2
True
2
因此,正如您所看到的,原始枚举数实际上并没有重置.
您可以在using
As接口中显式指定类型(因此您将装箱一次并传递枚举器的相同实例):
using(IEnumerator<int> e = l.GetEnumerator())
{
e.MoveNext();
DoSomethingWith(e);
DoSomethingWith(e);
}
或者将方法更改为接受List<int>.Enumerator
并将其传递给ref
:
void DoSomethingWith(ref List<int>.Enumerator e)
{
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
}
var e = l.GetEnumerator();
DoSomethingWith(ref e);
DoSomethingWith(ref e);
或者通过接口使用集合,因为IEnumerable<T>.GetEnumerator()
是显式实现的,装箱将由实现处理:
IEnumerable<int> lAsEn = l;
using(var e = lAsEn.GetEnumerator()) {
DoSomethingWith(e);
DoSomethingWith(e);
}