2013-12-20 2 views
4

Работа над внедрением интерфейса IEnumerable. Я на самом деле нашли два способа, которые должны быть реализованы:Зачем нужен IEnumerator <T> GetEnumerator() и GetEnumerator()?

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

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

ответ

6

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

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

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

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

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

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

+0

cool - спасибо за объяснение с историей. – user2210021

10

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

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

+0

Имеет смысл, спасибо. – user2210021

Смежные вопросы