【问题标题】:Why must IEnumerator<T> GetEnumerator() and GetEnumerator() be implemented?为什么必须实现 IEnumerator<T> GetEnumerator() 和 GetEnumerator()?
【发布时间】:2014-01-09 17:54:19
【问题描述】:
致力于实现IEnumerable 接口。
我其实找到了两个需要实现的方法:
public IEnumerator<Item> GetEnumerator()
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
不知道为什么我需要实现这两种方法(看起来很相似)。谁能给我解释一下?
【问题讨论】:
标签:
c#
iterator
ienumerable
ienumerator
【解决方案1】:
部分答案是“出于历史原因”。
IEnumerable 接口自 .NET 1.1 以来一直存在,而泛型(因此 IEnumerable<T>)被添加到 .NET 2 中。IEnumerable<T> 扩展了 IEnumerable,这是一个明智的决定,因为它允许您在已经编写的代码中使用IEnumerable<T> 以获取IEnumerable。
但这意味着要实现IEnumerable<T>(包括IEnumerator<T> GetEnumerator() 方法),您还必须实现IEnumerable(包括IEnumerator GetEnumerator() 方法)。
正如 Servy 所说,这没什么大不了的,因为您可以这样做:
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
其中非显式实现GetEnumerator 的返回类型为IEnumerator<T>。
【解决方案2】:
IEnumerable<T> 扩展了IEnumerable,因此您需要提供该方法的泛型和非泛型版本。
一个常见的解决方案是让非通用解决方案简单地调用通用解决方案,因为IEnumerator<T> 也扩展了IEnumerator。