【发布时间】:2012-09-24 17:54:31
【问题描述】:
如果集合或列表同时实现 IEnumerable
【问题讨论】:
如果集合或列表同时实现 IEnumerable
【问题讨论】:
IEnumerable<T> 有一个方法 GetEnumerator - 这将是一个 IEnumerator<T>,用于迭代(使用 MoveNext 方法)。
【讨论】:
您根本不能在IEnumerator<T> 上使用foreach。
您只能在具有GetEnumerator 方法的对象上使用foreach(无论它是否实现IEnumerable。
所以为了回答你的问题,它使用来自IEnumerable<T> 的GetEnumerator 方法。
证明很简单。试着编译一下:
IEnumerator<char> str = "asdf".GetEnumerator();
foreach (char c in str) { }
【讨论】:
还要注意,这不是集合实现 IEnumerable/IEnumerator 以便在 foreach 循环中使用的要求。 Foreach 使用此处描述的基于模式的方法Eric Lippert blog
【讨论】:
另一个(更相关的)问题是:如果一个类型显式地实现了IEnumerable<> 并且同时有一个合适的常规公共方法GetEnumerator() 怎么办?答:那就用public方法吧。
如果类型实现 both IEnumerable<Foo> 和 IEnumerable<Bar> 会怎样?然后,如果没有常规的实例方法GetEnumerator()(如果两个接口都被显式实现,就会发生这种情况),就会出现编译时错误。
【讨论】: