首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >List<T>.Enumerator IEnumerator.Reset()方法实现

List<T>.Enumerator IEnumerator.Reset()方法实现
EN

Stack Overflow用户
提问于 2013-09-30 17:50:56
回答 1查看 2.3K关注 0票数 6

尽管事实是, method should never be usedList<T>中发现了方法实现的奇怪行为。

无论您如何检查.NET框架源代码(尝试使用引用源和ILSpy),该方法的实现如下:

代码语言:javascript
复制
void System.Collections.IEnumerator.Reset() {
    if (version != list._version) {
        ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
    }

    index = 0;
    current = default(T);
}

但是,该方法似乎从未被调用过!考虑一下守则:

代码语言:javascript
复制
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);
}

很明显,它应该打印两次True3。相反,结果是

代码语言:javascript
复制
True
3
False
0

我错过了什么简单的解释吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-30 17:52:54

我错过了什么简单的解释吗?

是的:你在这里对List.Enumerator进行拳击:

代码语言:javascript
复制
((IEnumerator)e).Reset();

这需要一份现有的副本,并重置它

要重置实际的枚举数,需要如下所示:

代码语言:javascript
复制
var list = new List<int>(1) { 3 };
var e = list.GetEnumerator();
// Can't use "ref" with a using statement
try
{
    Console.WriteLine(e.MoveNext());
    Console.WriteLine(e.Current);

    Reset(ref e);

    Console.WriteLine(e.MoveNext());
    Console.WriteLine(e.Current);
}
finally
{
    e.Dispose();
}

static void Reset<T>(ref T enumerator) where T : IEnumerator
{
    enumerator.Reset();
}

这很棘手,因为它使用显式接口实现。

我还没有测试过,但我认为这对你有用。很明显这是个坏主意。

编辑:或者,只需将变量类型更改为IEnumeratorIEnumerator<int>即可。然后,它将被装箱一次,Reset方法将对装箱值进行变异:

代码语言:javascript
复制
var list = new List<int>(1) { 3 };
using (IEnumerator e = list.GetEnumerator())
{
    Console.WriteLine(e.MoveNext());
    Console.WriteLine(e.Current);

    e.Reset();

    Console.WriteLine(e.MoveNext());
    Console.WriteLine(e.Current);
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19100592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档