Метод, использующий yield
, перестраивается компилятором. Он создает конечный автомат с совершенно новым классом, сгенерированным компилятором.
Этот класс конечного автомата является IEnumerator
, а также IEnumerable
, чей метод GetEnumerator
возвращает сам себя.
Таким образом, в зависимости от того, как вы объявляете свой метод, компилятор генерирует код, который либо возвращает IEnumerable
, либо уже инициализированный IEnumerator
.
Как всегда, Джон Скит имеет хорошую статью о том, что происходит под капотом с ключевым словом yield
.