为了账号安全,请及时绑定邮箱和手机立即绑定

IEnumerable<T>和IEnumerator的问题

IEnumerable<T>和IEnumerator的问题

宝慕林4294392 2018-08-23 08:05:55
我在泛型中使用迭代器的时候,《C#入门经典》中说要同时实现IEnumerable GetEnumerator()和IEnumerable<T> GetEnumerator()。然后我就去查看了MSDN,我看到上面说IEnumerable<T>中的GetEnumerator()是被重载的,我点击之后,发现重载的两个版本方法名相同,都没有参数。这能叫重载吗?唯一的区别就是后面的介绍多了个——(继承自 IEnumerable)
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

首先,IEnumerable<T>实现了IEnumerable,并且显式实现了IEnumerable.GetEnumerator,MSDN中所说的继承自IEnuerable的那个GetEnumerator,指的就是这个显式实现。

其次,在设计实现了IEnumerable<T>的类的时候,除了要实现IEnumerable<T>.GetEnumerator之外,还要显式实现IEnuerable.GetEnumerator。也就是书上所说的那些。

举例:


public class People : IEnumerable
{
   private Person[] _people;
   public People(Person[] pArray)
   {
       _people = new Person[pArray.Length];

       for (int i = 0; i < pArray.Length; i++)
       {
           _people[i] = pArray[i];
       }
   }

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

   public PeopleEnum GetEnumerator()
   {
       return new PeopleEnum(_people);
   }
}


返回类型为PeopleEnum的GetEnumerator得到的是强类型的IEnumerator,而IEnumerable.GetEnumerator得到的是弱类型的。之所以这么设计,是为了向后兼容,因为很多旧的系统使用的都是IEnumerable,新的代码需要兼容这些接口。


查看完整回答
反对 回复 2018-08-27
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

namespace is : System.Collections   

public interface IEnumerable
{

 IEnumerator GetEnumerator();

}

namespace is :System.Collections.Generic

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

下面这个是上面的范型


查看完整回答
反对 回复 2018-08-27
  • 2 回答
  • 0 关注
  • 710 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信