Странный приоритет оператора с ?? (нулевой оператор объединения) - PullRequest
22 голосов
/ 15 июля 2010

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

AsБудет ли этот более простой пример:

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

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

Ответы [ 2 ]

26 голосов
/ 15 июля 2010

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

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";
11 голосов
/ 15 июля 2010

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

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

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

...