Возьмём к примеру обыйчный список List, он реализует интерфейс IEnumerable, который наследуется от IEnumerator
Если создать переменную интерфейса IEnumerator
IEnumerator<int> ien = (IEnumerator<int>) list
то можно вызывать метод MoveNext, и бегать по элементам колекции. Но почему через переменную интерфейса я могу обращаться к даным методам, а напрямую через list нет.
Тоесть если я напишу list.MoveNext - компилятор сообщит об ошибке
System.Collections.Generic.List<int>' does not contain a definition for 'MoveNext'
В свою очередь я могу вызвать метод GetEnumerator(), который задал нам интерфейс IEnumerable. В чем соль?