Этот вопрос действительно является ответвлением этого вопроса , но я думаю, что он заслуживает отдельного ответа.
Согласно разделу 15.13 ECMA-334 (на с использованием
, далее называемый получение ресурсов ):
Локальные переменные, объявленные в получение ресурсов доступны только для чтения и должны включать инициализатор. А ошибка времени компиляции возникает, если встроенный оператор пытается изменить эти локальные переменные (через присваивание или операторы
++
и-
) или передайте их какref
илиout
параметры.
Кажется, это объясняет, почему приведенный ниже код является незаконным.
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;
}
Но как насчет этого?
using (var e = new Mutable())
{
// This is doing exactly the same thing, but it compiles and runs just fine.
e.SetField(10);
}
Является ли приведенный выше фрагмент неопределенным и / или незаконным в C #? Если он допустим, какова связь между этим кодом и выдержкой из спецификации выше? Если это незаконно , почему это работает? Есть ли какая-то тонкая лазейка, которая позволяет это сделать, или тот факт, что он работает, объясняется простой удачей (так что никогда не следует полагаться на функциональность такого, казалось бы, безобидного кода)?