Это действительно ответвление this question, но я думаю, что он заслуживает собственного ответа.Изменяет тип значения из неопределенного поведения оператора using.
В соответствии с разделом 15.13 в ECMA-334 (на using
заявление, ниже упоминается как ресурсосбережение приобретения):
Локальные переменные, объявленные в ресурсосбережение приобретения являются Read- только, и должен включать инициализатор. ошибка времени компиляции происходит, если внедренных попыток изменить заявление этих локальных переменные (через присвоение или
++
и--
операторов) или передать их в качестве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#? Если это законно, какова связь между этим кодом и выдержкой из вышеприведенной спецификации? Если это незаконно, то почему он работает? Есть ли какая-то тонкая лазейка, которая разрешает это, или же факт, что она работает, относится только к простому удачу (так что никогда не следует полагаться на функциональность такого, казалось бы, безобидного кода)?
Вызывается метод, используя назначение? Использует ли он '' '' '' '' '' 'операторов? Передаёт ли он это как параметр 'ref' или' out'? –
@Anon: Это мой вопрос. Вызов метода по типу значения, который изменяет состояние этого значения, по существу, не отличается от назначения, не так ли? Вот почему изменение поля строго запрещено? –
Куда вы придумали этот материал? Примечательно, что свойство тоже не работает. Это всего лишь вызов метода под капотом, что не позволяет Remoting быть причиной. В любом случае. Эти шарлатаны как ошибка. Ну, недостаток. Упоминание имени Эрика Липперта обычно заставляет его посещать его. Готово. –