Regreso de rendimiento dentro de los usos

Si recuerdo correctamente que cuando usaba el rendimiento dentro deusing SqlConnection bloques Obtuve excepciones de tiempo de ejecución.

using (var connection = new SqlConnection(connectionString))
{
    var command = new SqlCommand(queryString, connection);
    connection.Open();

    SqlDataReader reader = command.ExecuteReader();

    // Call Read before accessing data.
    while (reader.Read())
    {
        yield reader[0];
    }

    // Call Close when done reading.
    reader.Close();
}

Estos problemas se resolvieron cuando reemplacéyield por una Lista donde agregué elementos en cada iteración.

El mismo problema aún no me sucedió cuando estaba dentrousing StreamReader blocks

using (var streamReader = new StreamReader(fileName))
{
    string line;
    while ((line = streamReader.ReadLine()) != null)
    {
        yield return line;
    }
}

¿Hay alguna explicación de por qué ocurrieron excepciones en el primer caso y no en el segundo? ¿Es aconsejable esta construcción?

EDITA Para obtener el error (eliminación anticipada) que hice en el pasado, debe llamar al primer método a continuación:

IEnumerable<string> Read(string fileName)
{
    using (var streamReader = new StreamReader(fileName))
    {
        return Read(streamReader);
    } // Dispose will be executed before ReadLine() because of deffered execution
}

IEnumerable<string> Read(StreamReader streamReader)
{
    string line;
    while ((line = streamReader.ReadLine()) != null)
    {
        yield return line;
    }
}

El mismo error se puede lograr con otras formas de diferir la ejecución, comoSystem.Linq.Enumerable.Select()

Respuestas a la pregunta(2)

Su respuesta a la pregunta