Каков операторский приоритет оператора С# null-coalescing (?)?

Я только что пробовал следующее: идея состоит в том, чтобы объединить две строки, подставив пустую строку для нулей.

string a="Hello";
string b=" World";

- Отладка (забавно, что? является печатью, не совсем помогает читабельности...)

 ? a ?? "" + b ?? "" 

- > "Привет"

Правильно:

? (a??"")+(b??"")
"Hello World"

Я вроде как ожидал "Hello World", или просто "World", если a равно null. Очевидно, что это todo с приоритетом оператора и может быть преодолено скобками, есть ли где-нибудь, что документирует порядок приоритета для этого нового оператора.

(понимая, что я, вероятно, должен использовать stringbuilder или String.Concat)

Спасибо.

Ответы

Ответ 1

Помимо того, что вы хотели бы иметь приоритет, что это такое по ECMA, что это в соответствии с спецификацией MS и тем, что на самом деле делает csc, у меня есть один совет:

Не делайте этого.

Я думаю, что гораздо яснее писать:

string c = (a ?? "") + (b ?? "");

В качестве альтернативы, учитывая, что null в конкатенации строк заканчивается тем, что просто является пустой строкой, просто напишите:

string c = a + b;

РЕДАКТИРОВАТЬ: В отношении документированного приоритета в спецификация С# 3.0 (документ Word) и ECMA-334, добавление связывается более жестко, чем?, что связывает более жесткие, чем назначение. Ссылка MSDN, указанная в другом ответе, является ошибочной и причудливой, ИМО. На странице, сделанной в июле 2008 года, было изменено изменение, которое переместило условный оператор - но, по-видимому, неправильно!

Ответ 2

Приоритет оператора документируется на MSDN.

Однако приоритет в MSDN противоречит приоритету как загружаемой спецификации С# также от Microsoft, а спецификация ECMA. Что немного странно.

Независимо, как сказал Джон Скит в своем ответе, лучше не полагаться на приоритет операторов, а быть явным путем использования скобок.

Ответ 3

Никогда не полагайтесь на приоритет оператора. Всегда явно указывать, как вы хотите, чтобы ваш код действовал. Сделайте себе и другим услугу, когда вернетесь к своему коду.

(a ?? "") + (b ?? "")

Это не оставляет места для двусмысленности. Неоднозначность - это почва ошибок.