什么时候迭代器 return 应该是 IEnumerator 而不是 IEnumerable?

When should an iterator return an IEnumerator instead of an IEnumerable?

使用yield return 将方法变成迭代器。 The return type of an iterator must be IEnumerable, IEnumerable<T>, IEnumerator, or IEnumerator<T>.

我发现如果迭代器 return 是 IEnumerable 类型之一,它只能在 foreach 循环中使用。鉴于此限制,什么时候选择 IEnumerator return 类型而不是 IEnumerable 才有意义?

老实说,很少见。我唯一一次看到它以这种方式使用的时候是出于某种原因 GetEnumerator() 方法 中(在启动迭代器块机制之前),但仍然想要一个用于实际实现的迭代器块,即

public IEnumerator<T> GetEnumerator()
{
    if (someScenario) return SomethingSpecialPerhapsEmptyArrayEnumerator();
    if (anotherScenario) ThrowSomeException();
    return DoTheThing();
}
private IEnumerator<T> DoTheThing()
{
    // ... yield return
}