Когда итератор должен возвращать IEnumerator вместо IEnumerable? - PullRequest
3 голосов
/ 15 апреля 2020

Использование yield return превращает метод в итератор. Возвращаемый тип итератора должен быть IEnumerable, IEnumerable<T>, IEnumerator или IEnumerator<T>.

Я обнаружил, что итератор может использоваться только в foreach l oop, если возвращается один из типов IEnumerable. Учитывая это ограничение, когда имеет смысл выбрать тип возврата IEnumerator вместо IEnumerable?

1 Ответ

4 голосов
/ 15 апреля 2020

Довольно редко, если честно. Единственный раз, когда я видел, что он использовал этот способ, это когда по особой причине в методе GetEnumerator() (до запуска механизма блока итераторов), но все еще нужен блок итератора для фактическая реализация, т.е.

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