首页 > 解决方案 > 如何列出.Enumerator 没有按照其接口的要求实现 Reset?

问题描述

在实现我自己的集合时,我通过将所有对象复制到一个列表中来模拟枚举器,然后将所有枚举器调用重定向到列表的枚举器,我存储了一个引用。但是当 List.Enumerator 没有 Reset 方法时,我遇到了问题;尽管它实现了 IEnumerator。

这是有问题的反映标题(已删除评论)

    public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
    {
        public struct Enumerator : IEnumerator<T>, IDisposable, IEnumerator
        {
            public T Current { get; }
            public void Dispose();
            public bool MoveNext();
        }
    }
    public interface IEnumerator<out T> : IDisposable, IEnumerator
    {
        T Current { get; }
    }
    public interface IEnumerator
    {
        object Current { get; }
        bool MoveNext();
        void Reset();
    }

我们可以看到 List.Enumerator 从 IEnumerator 派生两次;首先显式,然后通过 IEnumerator 隐式。但是这个示例程序不会编译。

List<int> list = new List<int>();
List<int>.Enumerator enumerator = list.GetEnumerator();
enumerator.Reset();

错误 CS1061“List.Enumerator”不包含“Reset”的定义,并且找不到接受“List.Enumerator”类型的第一个参数的扩展方法“Reset”(您是否缺少 using 指令或程序集引用?)

List.Enumerator 怎么可能不实现/公开在其接口之一中声明的方法?

标签: c#listinterfaceenumerator

解决方案


Reset方法通过显式接口实现来实现。请参阅:https ://source.dot.net/#System.Private.CoreLib/shared/System/Collections/Generic/List.cs,1141

因此,它不是公共成员List<T>.Enumerator


推荐阅读