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

Bon*_*han 2 c# ienumerator

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

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

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

    public IEnumerator GetEnumerator()
    {...}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 8

首先,正如其他人所说,你可以介绍反正没有实现接口的自己的方法-你可以写你自己的Dispose方法,无需实施IDisposable等驰名接口我建议这几乎是一个坏主意(如读者有一定的期望)但它完全有效.

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

然而,它通常是一个坏主意,要做到这一点,现在,如果你希望能够轻松地遍历实例作为集合的内容-事实上我建议实施IEnumerable<T>,而不是只IEnumerable.