2016-08-03 10 views
0

Kann jemand erklären, warum wirft die folgend ein Argument::? Bedingte Operator Unexpected Auswertung Verhalten

static void Main(string[] args) { 
      IEnumerable<int> lst= null; 
      var msg = ",lst=" + lst!= null ? String.Join(",", lst) : "null"; 
      Console.WriteLine(msg); 
     } 

und dies nicht:

static void Main(string[] args) { 
      IEnumerable<int> lst= null; 
      var msg = ",lst=" + (lst!= null ? String.Join(",", lst) : "null"); 
      Console.WriteLine(msg); 
     } 
+0

Was Sie wirft tun expect '", lst = "+ lst' zu tun, wenn' lst' null ist? –

+7

Weil '+' ein [Operator mit höherer Priorität] ist (https://msdn.microsoft.com/en-us/library/aa691323 (v = vs.71) .aspx) als '! ='. – Groo

+0

Grundsätzlich ist dies eine Reihenfolge der Operationen Problem. Ohne die Parens wird es "", lst "+ lst" vor dem "Null" Vergleich. – juharr

Antwort

4

Wegen der operator precedence Ihrer ersten Zeile des Codes

var msg = ",lst=" + lst!= null ? String.Join(",", lst) : "null"; 

entspricht

var msg = (",lst=" + lst) != null ? String.Join(",", lst) : "null"; 

Und da lst ist null es Argument Null Exception in String.Join

sein kann, eine gute Zeit zu investieren in ReSharper, Blick auf die Warnung ....

enter image description here

+0

wir benutzen CodeRush. Es hat es nicht verstanden ... – Denis

Verwandte Themen