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

时间:2010-05-25 14:46:50

标签: c# ienumerator

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

public class Primes
{
    private long min;
    private long max;

    public Primes()
        : this(2, 100)
    {
    }

    public IEnumerator GetEnumerator()
    {...}

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

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您没有必要实施IEnumerable来创建名为GetEnumerator的函数,该函数返回IEnumerator,这意味着您将无法提供该类型的实例需要IEnumerable

答案 3 :(得分:0)

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