首页 新闻 会员 周边 捐助

IEnumerable<T>和IEnumerator的问题

0
悬赏园豆:20 [已解决问题] 解决于 2011-03-26 20:37

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

南京工程的主页 南京工程 | 初学一级 | 园豆:160
提问于:2011-03-20 20:25
< >
分享
最佳答案
1

首先,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,新的代码需要兼容这些接口。

收获园豆:20
麒麟.NET | 老鸟四级 |园豆:3614 | 2011-03-21 16:21
其他回答(1)
0

namespace is : System.Collections   

public interface IEnumerable
{

 IEnumerator GetEnumerator();

}

namespace is :System.Collections.Generic

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

下面这个是上面的范型

Chenkun | 园豆:806 (小虾三级) | 2011-03-20 21:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册