可以在IEnumerator.GetEnumerator()中返回IEnumerator <t> .GetEnumerator()吗?</t>

时间:2011-01-14 18:24:01

标签: c# .net ienumerable

基本上假设你有一些收藏:

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&gt;但我仍然希望非通用版本稳定并正确实施。

3 个答案:

答案 0 :(得分:10)

这是完全标准的,建议遵守DRY和其他问题。

请注意

return strand;

应该是

yield return strand;

此外,看起来this.Strands已经实现了IEnumerable<FurStrand>,所以你可以说

return this.Strands.GetEnumerator();

答案 1 :(得分:5)

不,这是完全可以接受的。推荐均匀。

答案 2 :(得分:4)

这不仅是一种良好的做法,而且如果没有它,您的项目将无法实现,因为IEnumerable<T>继承了IEnumerable。查看IEnumerable<T>

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

您必须实现非通用版本,否则您将收到错误“...未实现接口成员...”