Wenn eine yield return -Anweisung im Iterator erreicht wir wird ein expression-Ausdruck zurückgegeben, und die aktuelle Position im Code wird beibehalten. When a yield return statement is reached in the iterator metho expression is returne and the current location in code is retained. Execution is restarted from that location the next time that the iterator function is called.
Quote from MSDN The yield keyword signals to the compiler that the method in which it appears is an iterator block. Yield return is similar to a return statement (which passes control flow to the calling method), followed by a goto to the yield statement in the next iteration of the foreach.

Consider the list of Prime Numbers, or an infinite list of random numbers. The yield break statement can be used in try or catch block but not in finally block. Der Grund dafür ist, dass die GetAllAnimals-Methode keine Sammlung von Tieren zurückgibt. Es gibt einen Enumerator zurück, der in der Lage ist, ein Tier auf einmal zurückzugeben. Mich hat mal interessiert, wie sich yield return Performance-mäßig so verhält im Vergleich zum Arbeiten mit einer Liste.
Dabei kamen sehr interessante Resultate zum Vorschein.
