猿问

IEnumerable<T>和IEnumerator的问题

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

宝慕林4294392
浏览 711回答 2
2回答

慕码人2483693

首先,IEnumerable<T>实现了IEnumerable,并且显式实现了IEnumerable.GetEnumerator,MSDN中所说的继承自IEnuerable的那个GetEnumerator,指的就是这个显式实现。其次,在设计实现了IEnumerable<T>的类的时候,除了要实现IEnumerable<T>.GetEnumerator之外,还要显式实现IEnuerable.GetEnumerator。也就是书上所说的那些。举例:public class People : IEnumerable{ &nbsp; &nbsp;private Person[] _people; &nbsp; &nbsp;public People(Person[] pArray) &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp;_people = new Person[pArray.Length]; &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i < pArray.Length; i++) &nbsp; &nbsp; &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_people[i] = pArray[i]; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp;} &nbsp; &nbsp;IEnumerator IEnumerable.GetEnumerator() &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; return (IEnumerator) GetEnumerator(); &nbsp; &nbsp;} &nbsp; &nbsp;public PeopleEnum GetEnumerator() &nbsp; &nbsp;{ &nbsp; &nbsp; &nbsp; &nbsp;return new PeopleEnum(_people); &nbsp; &nbsp;}}返回类型为PeopleEnum的GetEnumerator得到的是强类型的IEnumerator,而IEnumerable.GetEnumerator得到的是弱类型的。之所以这么设计,是为了向后兼容,因为很多旧的系统使用的都是IEnumerable,新的代码需要兼容这些接口。

守着星空守着你

namespace is :&nbsp;System.Collections&nbsp;&nbsp;&nbsp;public interface IEnumerable{&nbsp;IEnumerator GetEnumerator();}namespace is :System.Collections.Genericpublic interface IEnumerable<out T> : IEnumerable{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IEnumerator<T> GetEnumerator();}下面这个是上面的范型
随时随地看视频慕课网APP
我要回答