为什么必须实现IEnumerator <t> GetEnumerator()和GetEnumerator()?</t>

时间:2013-12-20 19:46:02

标签: c# iterator ienumerable ienumerator

致力于实施IEnumerable接口。 我实际上找到了两种需要实现的方法:

public IEnumerator<Item> GetEnumerator()
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()

不确定为什么我需要实现这两种方法(看起来非常相似)。有人能解释一下吗?

2 个答案:

答案 0 :(得分:10)

IEnumerable<T>扩展IEnumerable,因此您需要同时提供该方法的通用版本和非泛型版本。

一个常见的解决方案是让非通用解决方案简单地调用通用解决方案,因为IEnumerator<T>也扩展了IEnumerator

答案 1 :(得分:6)

部分答案是“出于历史原因”。

自.NET 1.1以来,IEnumerable接口已经存在,而在.NET 2中添加了泛型(因此IEnumerable<T>)。IEnumerable<T>扩展了IEnumerable,这是这是一个明智的决定,因为它允许您在已编写的代码中使用IEnumerable<T>来获取IEnumerable

但这意味着要实施IEnumerable<T>(包括IEnumerator<T> GetEnumerator()方法),您还必须实施IEnumerable(包括IEnumerator GetEnumerator()方法)。

正如Servy所说,这并不是什么大不了的事,因为你可以这样做:

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

其中非显式实现GetEnumerator是返回类型为IEnumerator<T>的实现。