Экспериментируя с тройными и нулевыми операторами объединения в 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 ++.
Это документированная функция? Есть ли какое-нибудь название для этого?