Объединить оператор в C #? - PullRequest
10 голосов
/ 13 октября 2010

Мне кажется, я помню что-то похожее на троичный оператор ?: в C #, который имел только две части и возвращал значение переменной, если оно не было нулевым, и значение по умолчанию, если оно , Примерно так:

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

В основном эквивалент этого:

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

Существует ли такая вещь, или я только что вообразил это где-нибудь?

Ответы [ 4 ]

25 голосов
/ 13 октября 2010

Да:

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

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

19 голосов
/ 13 октября 2010

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

В широком смысле это выглядит так:

result = first ?? second;

Здесь second будет оцениваться только в том случае, если first равно нулю.Он не должен быть целью назначения - вы можете использовать его для оценки аргумента метода, например.

Обратите внимание, что первый операнд имеет , который может быть обнуляем, новторой нет.Несмотря на то, что есть определенные детали относительно преобразований, в простом случае тип общего выражения является типом второго операнда.Из-за ассоциативности, вы также можете аккуратно сложить операторы:

int? x = GetValueForX();
int? y = GetValueForY();
int z = GetValueForZ();

int result = x ?? y ?? z;

Обратите внимание, что x и y обнуляются, а z и result - нет.Конечно, z может быть обнуляемым, но тогда result также должно быть обнуляемым.

В основном, операнды будут оцениваться в порядке, в котором они появляются в коде, соценка останавливается, когда он находит ненулевое значение.

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

3 голосов
/ 13 октября 2010

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

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

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

1 голос
/ 13 октября 2010

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

?? Оператор (C # Reference) (MSDN)

...