Почему реализация IList <T>требует определения двух методов GetEnumerator? - PullRequest
7 голосов
/ 10 декабря 2010

Когда я реализую IList<T>, я нахожу, что должен определить два GetEnumerator метода. Один возвращает значение типа IEnumerator, а другой возвращает IEnumerator<T>.

Я немного озадачен разницей между этими двумя GetEnumerator методами. Хотя типы возвращаемых данных, очевидно, отличаются, не содержат ли они по существу одни и те же данные?

Кроме того, почему обе версии GetEnumerator могут существовать как методы, если они отличаются только типом возвращаемого значения? Это нарушает правило в C #, которое указывает, что перегруженные методы не могут отличаться только типом возвращаемого значения.

Ответы [ 6 ]

11 голосов
/ 10 декабря 2010

Оба должны возвращать одинаковые данные, да.

IEnumerator взято из .Net v1.1, до того, как была введена общая типизация.IEnumerator<T> - это версия общего типа, добавленная в .Net v2.

«Старая» версия IEnumerator сохранена для совместимости, поэтому теперь IList<T> реализует оба.

Разница между ними заключается в том, что неуниверсальный IEnumerator возвращает объект, тогда как универсальный IEnumerator<T> возвращает T.Несмотря на то, что компилятор c # вставит приведение для вас, чтобы не-универсальный IEnumerator казался строго типизированным при использовании в foreach.

Наличие аргумента универсального типадостаточно, чтобы компилятор различал два интерфейса, но для того, чтобы класс реализовал оба интерфейса, он должен быть явно реализован.

8 голосов
/ 10 декабря 2010

Два исходят из отдельных интерфейсов, которые реализует сам IList, поэтому вы должны реализовать оба:

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

И они оба могут существовать благодаря Явной реализации интерфейса .

4 голосов
/ 10 декабря 2010

Да, оба метода должны возвращать одни и те же данные.

Они могут сосуществовать, потому что они являются частью двух разных интерфейсов, IEnumerable и IEnumerable<T>.

1 голос
/ 10 декабря 2010

Они оба могут существовать, потому что один из них будет реализован явно :

IEnumerator IEnumerable.GetEnumerator()
{

}

Если вы попытаетесь сделать их обоих неявно определенными, вы получитеошибки компиляции.

Да, они оба должны возвращать одни и те же данные.

Вам необходимо определить две версии GetEnumerator, чтобы удовлетворить оба интерфейса (IEnumerable и IEnumerable<T>) из которого IList<T> происходит.На практике, однако, вы обнаружите, что неуниверсальная версия GetEnumerator просто вызывает универсальную версию в большинстве реализаций.

0 голосов
/ 10 декабря 2010

IEnumerator перечисляет объекты, тогда как IEnumerator перечисляет T. Для вашего второго вопроса вторая функция полностью определена:

  System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()  
  {

  }

vs

public IEnumerator<T> GetEnumerator()
    {

    }
0 голосов
/ 10 декабря 2010

IList<T> Реализует IEnumerable<T> и IEnumerable. Различные реализации GetEnumerator происходят от каждого из этих интерфейсов. Оба должны возвращать одни и те же данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...