«yield» возвращает другой тип?

#c# #interface

#c# #интерфейс

Вопрос:

Допустим, у нас есть следующий код:

 public IEnumerator FirstTest()
{
   yield return 1;
}

public IEnumerable SecondTest()
{
    yield return 1;
}
  

Я знаю, что в коде нет логики, но он допустим, так почему же «yield» может возвращать другой тип, FirstTest возвращает IEnumerator, SecondTest возвращает IEnumerable? Между IEnumerator и IEnumerable нет отношения наследования

Комментарии:

1. Не забывайте, что компилятор умен. Существует очевидное, простое и универсальное решение, из IEnumerable которого IEnumerator можно выбраться.

Ответ №1:

Оба допустимы в соответствии с определением языка C # yield return

Объявление итератора должно соответствовать следующим требованиям:

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

В объявлении не может быть никаких параметров in ref или out.

Ответ №2:

Функция-итератор может возвращать перечислимое, IEnumerable, IEnumerator или IEnumerator. Взаимосвязь между интерфейсами здесь не имеет значения, поскольку это особенность языка.

Из документации,

Объявление итератора должно соответствовать следующим требованиям:

  • Возвращаемый тип должен быть IEnumerable, IEnumerable, IEnumerator или IEnumerator .
  • В объявлении не может быть никаких параметров in ref или out.