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,第二个不用加? 展开
{
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,第二个不用加? 展开
展开全部
按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>。
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 类就实现了共有的泛型遍历器。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询