Тройной / нулевой оператор объединения и выражение присваивания справа? - PullRequest
4 голосов
/ 05 декабря 2011

Экспериментируя с тройными и нулевыми операторами объединения в C #, я обнаружил, что можно использовать присваивания в правой части выражений, например, это допустимый код C #:

int? a = null;
int? b = null;
int? c = a ?? (b = 12);
int? d = a == 12 ? a : (b = 15);

Как ни странно, не только присваивание в правой части выражения оценивается в его собственной правой части (это означает, что третья строка здесь оценивается как 12, а не как что-то вроде b = 12 => void) , но это назначение также эффективно работает, так что две переменные назначаются в одном выражении. Можно также использовать любое вычислимое выражение в правой части этого присваивания с любой доступной переменной.

Такое поведение мне кажется очень странным. Я помню проблемы с if (a = 2) вместо if (a == 2) сравнения в C ++, которое всегда оценивается как true, и это распространенная ошибка после перехода с Basic / Haskell на C ++.

Это документированная функция? Есть ли какое-нибудь название для этого?

Ответы [ 2 ]

10 голосов
/ 05 декабря 2011

Это происходит как следствие того, что оператор присваивания также возвращает значение:

Оператор присваивания (=) сохраняет значение своего правого операнда в месте хранения, свойство или индексатор, обозначаемый его левым операндом и возвращающий значение в качестве результата.

Выражение b = 12 не только присваивает 12 b, но и возвращает это значение.

1 голос
/ 05 декабря 2011

Множественное задание работает в C #:

int a;
int b;
int c;
a = b = c = 5;
//all variables = 5;

if(6 == (c = 6)){
   //this will be true;
}

Если вы поместите переменную в правую часть уравнения, даже если ей было присвоено само значение в той же строке, она возвращает ее значение / ссылку.

...