2

I have a class called Primes and this class implements GetEnumerator() without implementing IEnumerable interface.

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

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

    public IEnumerator GetEnumerator()
    {...}

I don't get it. Am I missing something?

4

4 回答 4

8

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

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

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

于 2010-05-25T14:50:22.513 回答
1

没有理由IEnumerable为了创建一个调用GetEnumerator返回的函数而必须实现 a IEnumerator,这只是意味着您将无法提供该类型的实例给期望 a 的东西IEnumerable

于 2010-05-25T14:49:54.900 回答
1

是的你可以。甚至你可以在foreach. 尽管此类对象IEnumerable实现了所需的方法,但无法将其转换为唯一的问题。

于 2010-05-25T14:49:06.760 回答
0

接口确保合同,这并不意味着您不能在不隐含接口的类上拥有与接口中的签名相同的方法。

于 2010-05-25T14:50:24.940 回答