Ну, это не совсем то же самое, что условный оператор, но я думаю вы думаете об нулевом операторе объединения (??). (Думаю, вы сказали, что это было «похоже» :) Обратите внимание, что «тернарный» просто относится к количеству операндов, которым является оператор, поэтому, хотя условный оператор является тернарным оператором, оператор объединения с нулевым значением является бинарным оператором.
В широком смысле он принимает такую форму:
result = first ?? second;
Здесь second
будет оцениваться, только если first
равно нулю. Он не обязательно должен быть целью присваивания - вы можете использовать его, например, для оценки аргумента метода.
Обратите внимание, что первый операнд должен допускать значение NULL, а второй - нет. Хотя есть некоторые специфические детали преобразований, в простом случае типом общего выражения является тип второго операнда. Благодаря ассоциативности вы также можете аккуратно складывать использование оператора:
int? x = GetValueForX();
int? y = GetValueForY();
int z = GetValueForZ();
int result = x ?? y ?? z;
Обратите внимание, что x
и y
допускают значение NULL, а z
и result
- нет. Конечно, z
может допускать значение NULL, но тогда result
также должно допускать значение NULL.
В основном операнды будут оцениваться в том порядке, в котором они появляются в коде, с остановкой оценки, когда обнаруживается ненулевое значение.
Да, и хотя приведенное выше показано в терминах типов значений, оно также работает со ссылочными типами (которые всегда допускают значение NULL).
person
Jon Skeet
schedule
13.10.2010