【发布时间】:2013-10-06 16:37:07
【问题描述】:
尽管IEnumerator.Reset method should never be used 我发现List<T> 中方法实现的奇怪行为。
无论您如何检查 .NET Framework 源代码(使用参考源和 ILSpy 进行尝试),该方法的实现方式如下:
void System.Collections.IEnumerator.Reset() {
if (version != list._version) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
index = 0;
current = default(T);
}
但是,看起来该方法根本没有被调用!考虑代码:
var list = new List<int>(1) { 3 };
using (var e = list.GetEnumerator())
{
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
((IEnumerator)e).Reset();
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
}
很清楚,它应该打印两次True 和3。而不是结果是
True
3
False
0
我缺少任何简单的解释吗?
【问题讨论】:
-
原来是为什么可变结构是邪恶的一个新例子。通过显式接口实现发生突变的可变结构只是有点额外的邪恶。但是这些嵌套的
Enumerator结构通常仅在 C# 编译器翻译foreach语句时使用。
标签: c# list ienumerator