Можно ли возвращать IEnumerator <T>.GetEnumerator () в IEnumerator.GetEnumerator ()? - PullRequest
6 голосов
/ 14 января 2011

Предположим, у вас есть какая-то коллекция:

public class FurCollection : IEnumerable<FurStrand>
{
   public IEnumerator<FurStrand> GetEnumerator()
   {
      foreach(var strand in this.Strands)
      {
         yield return strand;
      }
   }

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

Это приемлемо? Или это склонная к ошибкам или плохая практика? Я почти всегда буду использовать IEnumerator<T>, но все же хочу, чтобы неуниверсальная версия была стабильной и правильно реализованной.

Ответы [ 3 ]

10 голосов
/ 14 января 2011

Это полностью стандарт и рекомендуется для соответствия с СУХОЙ и другими проблемами.

Обратите внимание, что

return strand;

должно быть

yield return strand;

Кроме того, похожеthis.Strands уже реализует IEnumerable<FurStrand>, чтобы вы могли просто сказать

return this.Strands.GetEnumerator();
5 голосов
/ 14 января 2011

Нет, это вполне приемлемо. Рекомендуется даже.

4 голосов
/ 14 января 2011

Мало того, что это хорошая практика, но ваш проект не будет компилироваться без него, потому что IEnumerable<T> наследует IEnumerable.Посмотрите на определение IEnumerable<T>:

public interface IEnumerable<out T> : IEnumerable
    IEnumerator<T> GetEnumerator();
}

Вы должны реализовать неуниверсальную версию, или вы получите сообщение об ошибке "... не реализует элемент интерфейса ..."

...