C# 为什么必须使用IEnumerator<;T>;是否实现GetEnumerator()和GetEnumerator()?

C# 为什么必须使用IEnumerator<;T>;是否实现GetEnumerator()和GetEnumerator()?,c#,iterator,ienumerable,ienumerator,C#,Iterator,Ienumerable,Ienumerator,正在实施IEnumerable接口。 实际上,我发现有两种方法需要实现: public IEnumerator<Item> GetEnumerator() System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() public IEnumerator GetEnumerator() System.Collections.IEnumerator System.Collections.IE

正在实施
IEnumerable
接口。 实际上,我发现有两种方法需要实现:

public IEnumerator<Item> GetEnumerator()
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
public IEnumerator GetEnumerator()
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
不知道为什么我需要实现这两个方法(看起来很相似)。有人能给我解释一下吗?

IEnumerable
扩展了
IEnumerable
,因此您需要提供该方法的通用和非通用版本

一个常见的解决方案是让非泛型解决方案简单地称为泛型解决方案,因为
IEnumerator
也扩展了
IEnumerator
,部分答案是“出于历史原因”

IEnumerable
接口从.NET1.1开始就存在,而泛型(因此
IEnumerable
)是在.NET2中添加的
IEnumerable
扩展了
IEnumerable
,这是一个明智的决定,因为它允许您在已编写的代码中使用
IEnumerable
,以获取
IEnumerable

但这意味着要实现
IEnumerable
(包括
IEnumerator GetEnumerator()
方法),还必须实现
IEnumerable
(包括
IEnumerator GetEnumerator()
方法)

正如Servy所指出的,这没什么大不了的,因为你可以这样做:

IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
其中,非显式实现
GetEnumerator
是返回类型为
IEnumerator
的实现