Почему должны быть реализованы IEnumerator‹T› GetEnumerator() и GetEnumerator()?

Работаем над реализацией интерфейса IEnumerable. На самом деле я нашел два метода, которые необходимо реализовать:

public IEnumerator<Item> GetEnumerator()
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()

Не уверен, зачем мне нужно реализовать эти два метода (которые выглядят очень похоже). Может ли кто-нибудь объяснить это мне?


person Jason    schedule 20.12.2013    source источник


Ответы (2)


Часть ответа "по историческим причинам".

Интерфейс IEnumerable существует со времен .NET 1.1, тогда как дженерики (и, следовательно, IEnumerable<T>) были добавлены в .NET 2. IEnumerable<T> расширяет IEnumerable, что было разумным решением, поскольку позволяет использовать IEnumerable<T> в уже написанном коде, чтобы принимать IEnumerable.

Но это означает, что для реализации IEnumerable<T> (который включает в себя метод IEnumerator<T> GetEnumerator()) вы также должны реализовать IEnumerable (который включает в себя метод IEnumerator GetEnumerator()).

Как заметил Серви, это не так уж и важно, потому что вы можете просто сделать это:

IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }

где неявная реализация GetEnumerator — это та, тип возвращаемого значения которой равен IEnumerator<T>.

person Tim Goodman    schedule 20.12.2013

IEnumerable<T> расширяет IEnumerable, поэтому вам необходимо предоставить как универсальную, так и неуниверсальную версию метода.

Обычное решение состоит в том, чтобы неуниверсальное решение просто вызывало универсальное решение, поскольку IEnumerator<T> также расширяет IEnumerator.

person Servy    schedule 20.12.2013