Изменяет ли тип значения из неопределенного поведения оператора using?

Этот вопрос действительно является ответвлением этого вопроса , но я думаю, что он заслуживает отдельного ответа.

Согласно разделу 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 #? Если он допустим, какова связь между этим кодом и выдержкой из спецификации выше? Если это незаконно , почему это работает? Есть ли какая-то тонкая лазейка, которая позволяет это сделать, или тот факт, что он работает, объясняется простой удачей (так что никогда не следует полагаться на функциональность такого, казалось бы, безобидного кода)?

11
задан Community 23 May 2017 в 11:55
поделиться