A modificação de um tipo de valor dentro de um comportamento indefinido da instrução using?

Este é realmente um ramo deessa questão, mas acho que merece sua própria resposta.

De acordo com a seção 15.13 do ECMA-334 (nousing abaixo, referida comoaquisição de recursos):

Variáveis locais declaradas em umaquisição de recursos são somente leitura e devem incluir um inicializador. Ocorre um erro em tempo de compilação se a instrução incorporada tentar modificar essas variáveis locais (por meio da atribuição ou do método++ e-- operadores) ou passá-los comoref ouout parâmetros.

Isso parece explicar por que o código abaixo é ilegal.

struct Mutable : IDisposable
{
    public int Field;
    public void SetField(int value) { Field = value; }
    public void Dispose() { }
}

using (var m = new Mutable())
{
    // This results in a compiler error.
    m.Field = 10;
}

Mas e isso?

using (var e = new Mutable())
{
    // This is doing exactly the same thing, but it compiles and runs just fine.
    e.SetField(10);
}

O trecho acima é indefinido e / ou ilegal em C #? Se for legal, qual é a relação entre esse código e o trecho da especificação acima? Se éilegal, por que isso funciona? Existe alguma brecha sutil que permite isso ou o fato de funcionar apenas como mera sorte (para que nunca se deva confiar na funcionalidade de um código aparentemente inofensivo)?

questionAnswers(4)

yourAnswerToTheQuestion