我们可以在不使用IEnumerable接口的情况下使用GetEnumerator()吗?

我有一个名为Primes的类,这个类实现了GetEnumerator()而没有实现IEnumerable接口。

public class Primes { private long min; private long max; public Primes() : this(2, 100) { } public IEnumerator GetEnumerator() {...} 

我不明白。 我错过了什么吗?

首先,正如其他人所说,你可以在不实现接口的情况下引入自己的方法 – 你可以编写自己的Dispose方法而不实现IDisposable等。对于众所周知的接口,我建议这几乎是一个坏主意(因为读者会有一定的想法)期望)但它完全有效。

更重要的是,C#中的foreach语句可以在不涉及IEnumerable情况下工作。 编译器有效地在名称GetEnumerator()CurrentMoveNext()上进行编译时鸭子输入。 这主要是为了允许在generics之前在C#1中进行强类型(和非装箱)迭代。 有关详细信息,请参阅C#3规范的第8.8.4节。

但是,如果您希望能够轻松地将实例的内容作为集合进行迭代,那么现在执行此操作通常是一个坏主意 – 实际上我建议实现IEnumerable而不仅仅是IEnumerable

是的你可以。 即使你可以在foreach使用它。 尽管它们实现了所需的方法,但是这个类的对象无法转换为IEnumerable的唯一问题。

没有理由你必须实现IEnumerable才能创建一个名为GetEnumerator的函数来返回一个IEnumeratorGetEnumerator意味着你将无法向需要IEnumerable东西提供该类型的实例。

一个接口确保一个契约,这并不意味着你不能拥有一个方法,该方法与一个没有实现该接口的类的接口中的签名具有相同的签名。