Каков операторский приоритет оператора С# 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 ?? "")
Это не оставляет места для двусмысленности. Неоднозначность - это почва ошибок.
Ответ 4
Интересно, что http://msdn.microsoft.com/en-us/library/6a71f45d.aspx и http://en.csharp-online.net/ECMA-334:_14.2.1_Operator_precedence_and_associativity имеют другой приоритет.
MSDN:
- Условный
- Назначение
- Null-coalescing
- Lambda
ECMA:
- Null Coalescing
- Условный
- Назначение
Я думаю, что msdn должен ошибаться, подумайте:
string a = null;
string b = a ?? "foo";
// What is b now?
Ответ 5
http://en.csharp-online.net/ECMA-334:_14.2.1_Operator_precedence_and_associativity