C# IEnumerable<T>问题

publicclassShortList<T>:IList<T>{protectedIList<T>innerCollection;publicShortList(){i... public class ShortList<T>:IList<T>
{
protected IList<T> innerCollection;
public ShortList()
{
innerCollection = new List<T>;

}

......
Public IEnumerable<T> GetEnumerator()
{
return innerCollection.GetEnumerator();

}

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

}

}

省略了一部分代码。
IList<T>是继承IEnumerable和IEnumerable<T>接口的,可是为什么这两个的返回值由两个类调用各自的GetEnumerator()方法?而且为什么第一个要加Public,第二个不用加?
展开
 我来答
freeeeeewind
推荐于2016-01-26 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1347万
展开全部
按MSDN文档:IList<T>定义如下:
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

要注意的是,IEnumerable<T>的定义
public interface IEnumerable<out T> : IEnumerable

即泛型IEnumerable<T>继承自非泛型IEnumerable。
=====
按上面的定义,如果你要实现IEnumerable<T>,那你必须实现IEnumerable
=====

所以,在代码中加入一个私有的方法:
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
  return GetEnumerator();
}
这样,不仅实现了非泛型的IEnumerator,满足了上面的定义,同时,又向外部提供了泛型的IEnumerable<T>。
追问
为什么要实现IEnumerable,就必须实现IEnumerable?

还是没弄清楚为什么是私有的,而且你的这个例子最后返回的为什么是GetEnumerator(),而不是innerCollection.GetEnumerator
追答
因为“泛型IEnumerable继承自非泛型IEnumerable”
这意味着你要获取IEnumerable,就必须实现非泛型的IEnumerable。
至于方法
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
是私有的原因:
1)因为你定义了public class ShortList:IList,表示你要公开的泛型遍历器,而不是非泛型的遍历器;所以,你用
Public IEnumerable GetEnumerator() {……} 来公开泛型遍历器。

2)因为必须实现非泛型的IEnumerable,所以用上面的私有方法来实现。

这样,public class ShortList:IList 类就实现了共有的泛型遍历器。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式