Приведённый код превращаются в следующее (часть генерированного кода специальна удалена для лучшего понимания):
private sealed class FooEnumerable :
IEnumerable<string>, IEnumerator<string>
{
private int state;
public string Current { get; private set; }
object IEnumerator.Current
{
get { return Current; }
}
public FooEnumerable(int state)
{
this.state = state;
}
public IEnumerator<string> GetEnumerator()
{
FooEnumerable fooEnumerable;
if (state == -2)
{
state = 0;
fooEnumerable = this;
}
else
fooEnumerable = new FooEnumerable(0);
return fooEnumerable;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
bool IEnumerator.MoveNext()
{
switch (state)
{
case 0:
Current = "Bar";
state = 1;
return true;
case 1:
state = -1;
Console.WriteLine("Baz");
break;
}
return false;
}
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
void IDisposable.Dispose()
{
}
}
IEnumerable<string> Foo()
{
return new FooEnumerable(-2);
}
void Main()
{
var enumerator = Foo().GetEnumerator();
while (enumerator.MoveNext())
Console.Write(enumerator.Current);
}