Qual è la precedenza degli operatori di C # null-coalescenza (??) operatore?
-
21-08-2019 - |
Domanda
Ho appena provato la seguente, con l'idea di concatenare le due stringhe, sostituendo una stringa vuota per i valori nulli.
string a="Hello";
string b=" World";
- Debug (? Divertente che è la stampa, non esattamente aiutare la leggibilità ...)
? a ?? "" + b ?? ""
-> "Ciao"
corretta è:
? (a??"")+(b??"")
"Hello World"
Ero un po 'aspettavo "Ciao Mondo", o semplicemente "World", se a è nullo. Ovviamente questo è todo con precedenza degli operatori e può essere superata da parentesi, c'è da nessuna parte che documenta l'ordine di precedenza per questo nuovo operatore.
(Rendendosi conto che dovrei probabilmente utilizzerò StringBuilder o String.Concat)
Grazie.
Soluzione
A parte quello che ci si come la precedenza di essere, ciò che è in base alla ECMA, che cosa è in base alle specifiche SM e ciò che realmente fa csc, ho un po 'di consigli:
Non fare questo .
Credo che sia molto più chiaro a scrivere:
string c = (a ?? "") + (b ?? "");
In alternativa, dato che null in concatenazione stringa finisce per essere solo una stringa vuota comunque, basta scrivere:
string c = a + b;
EDIT: Per quanto riguarda la precedenza documentato, sia nel C # 3.0 spec (documento Word) e ECMA-334 , inoltre si lega più stretto di ??, che si lega più stretto di assegnazione. Il collegamento MSDN data in un'altra risposta è semplicemente sbagliato e bizzarro, IMO. C'è un cambiamento illustrato nella pagina fatta nel luglio 2008 che ha spostato l'operatore condizionale - ma a quanto pare in modo non corretto
Altri suggerimenti
Non contare sulla priorità degli operatori. sempre in modo esplicito specificare come si desidera il codice di agire. Fate voi stessi e gli altri un favore per quando si torna al codice.
(a ?? "") + (b ?? "")
Questa non lascia spazio ad ambiguità. L'ambiguità è il terreno di coltura di bug.
La precedenza degli operatori è documentato su MSDN .
Tuttavia la precedenza su MSDN contraddice la precedenza sia nel scaricabile C # spec anche da Microsoft, e la specifiche su ECMA . Che è un po 'strano.
A prescindere, come ha detto Jon Skeet nella sua risposta, meglio non fare affidamento sulla precedenza degli operatori, ma per essere esplicita attraverso l'uso di parentesi.
E 'interessante il fatto che http://msdn.microsoft.com/en- us / library / 6a71f45d.aspx e http: // it .csharp-online.net / ECMA-334:. _14.2.1_Operator_precedence_and_associativity dare la precedenza diverso a ??
MSDN:
- condizionale
- Assegnazione
- Null-coalescenza
- Lambda
ECMA:
- Null coalescenza
- condizionale
- Assegnazione
Credo che MSDN deve essere sbagliato, prendere in considerazione:
string a = null;
string b = a ?? "foo";
// What is b now?