Слишком странный приоритет оператора с? (оператор нулевой коалесценции)
Недавно у меня была странная ошибка, в которой я связывал строку с 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;
Может кто-нибудь объяснить, как это работает для меня?
Ответы
Ответ 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"
будут объединены.