Странный приоритет оператора с?? (пустой оператор объединения)

Недавно у меня была странная ошибка, где я связывал строку с int? и затем добавляя другую строку после этого.

Мой код был в основном эквивалентом этого:

int? x=10;
string s = "foo" + x ?? 0 + "bar";

Удивительно достаточно это выполнит и скомпилирует без предупреждений или несовместимых ошибок типа, как будет это:

int? x=10;
string s = "foo" + x ?? "0" + "bar";

И затем это приводит к неожиданной ошибке несовместимости типа:

int? x=10;
string s = "foo" + x ?? 0 + 12;

Как будет этот более простой пример:

int? x=10;
string s = "foo" + x ?? 0;

Кто-то может объяснить, как это работает мне?

22
задан Earlz 15 July 2010 в 19:44
поделиться

2 ответа

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

int? x = 10;
string s = ("foo" + x) ?? (0 + "bar");

В этом примере оба выражения являются строками, поэтому он компилируется, но не делай что хочешь. В следующем примере левая часть оператора ?? представляет собой строку, а правая часть - целое число, поэтому оно не компилируется:

int? x = 10;
string s = ("foo" + x) ?? (0 + 12);
// Error: Operator '??' cannot be applied to operands of type 'string' and 'int'

Решение, конечно же, состоит в том, чтобы добавить круглые скобки:

int? x = 10;
string s = "foo" + (x ?? 0) + "bar";
26
ответ дан 29 November 2019 в 04:57
поделиться

Оператор ??? оператор имеет меньший приоритет, чем оператор +, поэтому ваше выражение действительно работает как:

string s = ("foo" + x) ?? (0 + "bar");

Сначала конкатенируется строка "foo" и строковое значение x, а если это будет null (чего быть не может), то конкатенируется строковое значение 0 и строка "bar".

11
ответ дан 29 November 2019 в 04:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: