在实现自己的集合时,我通过将所有对象复制到列表中来模拟枚举器,然后将所有枚举器调用重定向到列表的枚举器,并将引用存储到该枚举器中。但是当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为何不实现/公开在其接口之一中声明的方法?
答案 0 :(得分:-1)
Reset
方法是通过显式接口实现实现的。参见:https://source.dot.net/#System.Private.CoreLib/shared/System/Collections/Generic/List.cs,1141
因此,它不是List<T>.Enumerator
的公开成员