Задать вопрос

Как реализовывается IEnumerable?

Возьмём к примеру обыйчный список 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. В чем соль?
  • Вопрос задан
  • 2725 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
BigObfuscator
@BigObfuscator
Реализация интерфейсов может быть двумя способами: implicit и explicit.
В первом случае - методы интерфейса непосредственно доступны для класса. Во втором случае - методы доступны только после явного кастинга объекта к типу интерфейса.
Explicit реализация интерфейса позволяет классу реализовать несколько интерфейсов с одноименными методами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
lam0x86
@lam0x86
Прошу прощения, но IEnumerable не наследуется от IEnumerator. Ваш код с приведением типа списка к IEnumerator не должен компилироваться. Интерфейсы IEnumerator и IEnumerable тесно интегрированы с компилятором, из-за чего иногда возникает путаница: и тот, и другой интерфейс можно использовать в yield-statements, но по факту в foreach-statements можно использовать только IEnumerable (а на самом деле, всё еще сложнее - в foreach можно использовать вообще любой тип, у которого есть метод GetEnumerator(), но это совсем другая история).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы