Was ist die operator-Rangfolge der C# - null-coalescing (??) operator?
Ich habe einfach versucht, die folgenden, wobei die Idee zum verketten von zwei Zeichenketten, das ersetzen Sie eine leere Zeichenfolge null-Werte.
string a="Hello";
string b=" World";
-- Debug (amüsant, dass ? ist drucken, nicht genau helfen, Lesbarkeit...)
? a ?? "" + b ?? ""
-> "Hello"
Richtige ist:
? (a??"")+(b??"")
"Hello World"
War ich irgendwie erwarten, dass "Hallo Welt", oder einfach "Welt", wenn a null ist. Offensichtlich ist dies ein todo mit Rangfolge und können überwunden werden durch eckige Klammern, gibt es überall, dass Dokumente, die die Rangfolge für diese neue Betreiber.
(Die Realisierung, dass sollte ich wohl mit stringbuilder oder String.Concat)
Dank.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abgesehen von dem, was würden Sie wie den Vortritt zu werden, was es ist gemäß ECMA, was es ist, nach der MS Skillung und was csc eigentlich macht, habe ich einen Ratschlag:
Dies nicht tun.
Ich denke, es ist viel klarer zu schreiben:
Alternativ gegeben, dass die null im string-Verkettung endet gerade eine leere Zeichenfolge, die sowieso nur schreiben:
EDIT: in Bezug auf die dokumentierte Rangfolge, in der sowohl die C# 3.0-spec (Word-Dokument) und ECMA-334, neben bindet enger als ??, was bindet enger als Zuordnung. Der MSDN-link in der anderen Antwort ist einfach falsch und Bizarr, IMO. Es gibt eine Veränderung auf der Seite angezeigt im Juli 2008 was bewegt die bedingte operator - aber anscheinend falsch!
Verlassen Sie sich nie auf die Operatorrangfolge. Immer explizit angeben, wie Sie wollen, dass Ihr code, um zu handeln. Tun Sie sich und anderen einen gefallen, wenn Sie kommen zurück zu Ihrem code.
Diese lässt keinen Raum für Mehrdeutigkeit. Mehrdeutigkeit ist der Nährboden für Fehler.
Die Rangfolge ist dokumentiert auf MSDN.
Jedoch die Rangfolge, die auf der MSDN-Website widerspricht die Rangfolge, die sowohl die herunterladbare C# spec auch von Microsoft, und die Spezifikation ECMA. Das ist ein wenig seltsam.
Unabhängig, wie Jon Skeet, sagte in seiner Antwort, am besten nicht zu verlassen Sie sich auf die Rangfolge der Operatoren, sondern explizit durch die Verwendung von Klammern.
Es interessant, dass http://msdn.microsoft.com/en-us/library/6a71f45d.aspx und http://en.csharp-online.net/ECMA-334:_14.2.1_Operator_precedence_and_associativity geben, anderen den Vorrang zu ??.
msdn:
ECMA:
Ich denke, dass die msdn falsch sein muss, berücksichtigen Sie: