Недавно у меня была странная ошибка, где я связывал строку с 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;
Кто-то может объяснить, как это работает мне?
Оператор объединения с нулевым значением имеет очень низкий приоритет , поэтому ваш код интерпретируется как:
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";
Оператор ???
оператор имеет меньший приоритет, чем оператор +
, поэтому ваше выражение действительно работает как:
string s = ("foo" + x) ?? (0 + "bar");
Сначала конкатенируется строка "foo"
и строковое значение x
, а если это будет null (чего быть не может), то конкатенируется строковое значение 0
и строка "bar"
.