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)?