Подтвердить что ты не робот

Слишком странный приоритет оператора с? (оператор нулевой коалесценции)

Недавно у меня была странная ошибка, в которой я связывал строку с 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;

Может кто-нибудь объяснить, как это работает для меня?

4b9b3361

Ответ 1

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

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";

Ответ 2

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

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

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