Для правильной реализации интерфейса IEnumerable
необходимо вернуть в точности IEnumerator
. Он делает это, используя «явную реализацию интерфейса», поэтому в public API вы видите PeopleEnum
, но IEnumerable
все еще счастлив
Но на самом деле вы бы очень редко писали перечислитель таким образом на C # 2.0 или выше; вы бы использовали блок итератора (yield return
). См. C # в глубине глава 6 (свободная глава!).
Для сведения, причина того, что PeopleEnum
существует на всех , заключается в том, что это похоже на образец .NET 1.1, где это единственный способ создать типизированный перечислитель. В .NET 2.0 и выше есть IEnumerable<T>
/ IEnumerator<T>
, который имеет типизированный (с помощью обобщений) .Current
.
В .NET 2.0 / C # 2.0 (или выше) я бы просто:
public class People : IEnumerable<Person> {
/* snip */
public IEnumerator<Person> GetEnumerator() {
return ((IEnumerable<Person>)_people).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() { return _people.GetEnumerator();}
}