我在泛型中使用迭代器的时候,《C#入门经典》中说要同时实现IEnumerable GetEnumerator()和IEnumerable<T> GetEnumerator()。然后我就去查看了MSDN,我看到上面说IEnumerable<T>中的GetEnumerator()是被重载的,我点击之后,发现重载的两个版本方法名相同,都没有参数。这能叫重载吗?唯一的区别就是后面的介绍多了个——(继承自 IEnumerable)
首先,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,新的代码需要兼容这些接口。
namespace is : System.Collections
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
namespace is :System.Collections.Generic
public interface IEnumerable<out T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
下面这个是上面的范型