While implementing my own collection, I mocked the enumerator by coping all objects into a List, then redirect all enumerator calls to the list's enumerator, to which I stored a reference. But I ran into a problem when List.Enumerator doesn't have a Reset method; despite the fact that it implements IEnumerator.
Here are the reflected headers in question (with comments stripped)
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();
}
Where we can see the List.Enumerator derives from IEnumerator twice; first explicitly, then implicitly through IEnumerator. But this sample program won't compile.
List<int> list = new List<int>();
List<int>.Enumerator enumerator = list.GetEnumerator();
enumerator.Reset();
Error CS1061 'List.Enumerator' does not contain a definition for 'Reset' and no extension method 'Reset' accepting a first argument of type 'List.Enumerator' could be found (are you missing a using directive or an assembly reference?)
How is it possible that List.Enumerator doesn't implement/expose a method declared in one of its interfaces?