How does the compiler use 'yield return' to build a class
<p>In specific, if I say:</p>

<pre><code>    public static IEnumerable&lt;String&gt; Data()
    {
        String connectionString = "...";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            IDataReader reader = new SqlCommand("", connection).ExecuteReader();

            while (reader.Read())
                yield return String.Format("Have a beer {0} {1}!", reader["First_Name"], reader["Last_Name"]);

            connection.Close();
        }
    }
</code></pre>

<p>How does the compiler go about generating a concrete enumerable class out of this?</p>
