"""The GetEnumerator method makes use of the new yield statement. A yield statement returns an expression. The yield statement appears only inside an iterator block and returns the value that is expected by the calling foreach statement. That is, each call to GetEnumerator will yield the next string in the collection; all the state management is done for you!"""
This explanation of yield seems confused. The foreach statement isn't calling GetEnumerator repeatedly to get the next value, based on the type signature of GetEnumerator it'd be creating a new enumerator each time it did... and indeed the following example confirms that the yield statement bottles up the state of the method halting execution of the method in between MoveNext calls:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;