2016-08-03 72 views
0

有人可以解釋爲什麼以下拋出ArgumentNullException::?條件運算符意外的評估行爲

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

,這並不:

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

你這是什麼期望'「,lst =」+ lst'在'lst'爲空時做? –

+7

因爲'+'是[高優先級運算符](https://msdn.microsoft.com/en-us/library/aa691323(v = vs.71).aspx)而不是'!='。 – Groo

+0

基本上這是操作問題的順序。沒有parens它會在'null'比較之前執行'',lst「+ lst'。 – juharr

回答

4

由於代碼

var msg = ",lst=" + lst!= null ? String.Join(",", lst) : "null"; 
operator precedence你的第一線

相當於

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

而且由於lstnull它拋出String.Join

參數空例外可能是投資ReSharper的,看警告的好時機....

enter image description here

+0

我們使用CodeRush。它沒有抓住它... – Denis