List <T> .Enumerator如何不实现其接口要求的Reset?

时间:2019-07-09 16:48:07

标签: c# list interface enumerator

在实现自己的集合时,我通过将所有对象复制到列表中来模拟枚举器,然后将所有枚举器调用重定向到列表的枚举器,并将引用存储到该枚举器中。但是当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'的定义,并且找不到扩展方法'Reset'接受类型为'List.Enumerator'的第一个参数(是否缺少using指令或程序集参考?)

List.Enumerator为何不实现/公开在其接口之一中声明的方法?

1 个答案:

答案 0 :(得分:-1)

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

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