【问题标题】::? Conditional Operator Unexpected Evaluation Behavior:?条件运算符意外的评估行为
【发布时间】:2016-08-03 13:45:08
【问题描述】:

有人可以解释为什么下面会抛出 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);
        }

【问题讨论】:

  • lst 为空时,您希望",lst=" + lst 做什么?
  • 因为+higher precedence operator 而不是!=
  • 基本上这是一个操作顺序问题。如果没有括号,它将在 null 比较之前执行 ",lst" + lst
  • 有道理!请张贴这些作为答案,这样我就可以给你信用。
  • (",lst=" + lst )!= null 是评估表达式为 true 所以 String.Join(",", lst) throw ArgumentNullException

标签: c# .net


【解决方案1】:

因为operator precedence你的第一行代码

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

等价于

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

由于lstnull,它会在String.Join 中引发Argument Null 异常

可能是投资 Resharper 的好时机,看看警告......

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 2012-02-12
    • 1970-01-01
    • 2012-05-18
    • 2016-04-14
    • 2021-11-04
    • 2016-07-09
    • 1970-01-01
    • 2015-08-16
    相关资源
    最近更新 更多