Оператор объединения в с #?

Я помню, как видел что-то похожее на ?: Тернарный оператор в C #, который имел только две части и возвращал бы значение переменной, если оно не было нулевым, и значение по умолчанию, если бы оно было. Что-то вроде этого:

tb_MyTextBox.Text = o.Member ??SOME OPERATOR HERE?? "default";

По сути, эквивалент этого:

tb_MyTextBox.Text = o.Member != null ? o.Member : "default";

Существует ли такая вещь, или я просто представил, что где-то ее вижу?


person Abe Miessler    schedule 13.10.2010    source источник
comment
Возможный дубликат - ›stackoverflow.com/questions/ 463155 /   -  person Junior Mayhé    schedule 13.10.2010
comment
@Junior, но речь идет о тернарном операторе, тогда как речь идет об операторе объединения (несмотря на заголовок)   -  person Rup    schedule 13.10.2010
comment
@Junior, хотя название моего вопроса немного вводит в заблуждение, если вы прочитаете мой вопрос, вы увидите, что он не имеет ничего общего с дубликатом, который вы предложили.   -  person Abe Miessler    schedule 13.10.2010
comment
@Rup, действительно, название немного сбивает с толку. Примерно так @Abe ищет spinningtheweb.blogspot.com/ 09/06/2006 / c-coalesce-operator.html. Возможно, ему удастся изменить заголовок своего вопроса.   -  person Junior Mayhé    schedule 13.10.2010
comment
?? НЕКОТОРЫЙ ОПЕРАТОР ЗДЕСЬ ?? - так близко, так близко ...; ›   -  person dthorpe    schedule 13.10.2010


Ответы (4)


Ага:

tb_myTextBox.Text = o.Member ?? "default";

http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx

person Pete    schedule 13.10.2010

Ну, это не совсем то же самое, что условный оператор, но я думаю вы думаете об нулевом операторе объединения (??). (Думаю, вы сказали, что это было «похоже» :) Обратите внимание, что «тернарный» просто относится к количеству операндов, которым является оператор, поэтому, хотя условный оператор является тернарным оператором, оператор объединения с нулевым значением является бинарным оператором.

В широком смысле он принимает такую ​​форму:

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

Забавно, что вы использовали «?? НЕКОТОРЫЙ ОПЕРАТОР ЗДЕСЬ ??», поскольку искомый оператор - «??», то есть:

tb_MyTextBox.Text = o.Member ?? "default";

http://msdn.microsoft.com/en-us/library/ms173224.aspx

person Keith    schedule 13.10.2010
comment
Хех, должно быть, мое подсознание потянулось. Знал, что где-то видел это. - person Abe Miessler; 13.10.2010

Да, это называется оператором Null Coalescing:

?? Оператор (Справочник по C #) (MSDN)

person Kev    schedule 13.10.2010