Это действительно ответвление этого вопроса, но я думаю, что он заслуживает собственного ответа.
В соответствии с разделом 15.13 ECMA-334 (в заявлении using
, ниже называемом приобретением ресурсов):
Локальные переменные, объявленные в получение ресурсов доступно только для чтения и включает инициализатор. ошибка времени компиляции возникает, если встроенный оператор пытается изменить эти локальные переменные (через присвоение или операторы
++
и--
), или передайте их как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);
}
Является ли приведенный выше фрагмент undefined и/или незаконным в С#? Если это законно, какова связь между этим кодом и выдержкой из вышеприведенной спецификации? Если это незаконно, почему это работает? Есть ли какая-то тонкая лазейка, которая разрешает это, или же факт, что она работает, относится только к простому удачу (так что никогда не следует полагаться на функциональность такого, казалось бы, безобидного вида кода)?