2016-08-03 62 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