【问题标题】:C# conditional lambda instead of if statements. Value cannot be null errorC# 条件 lambda 而不是 if 语句。值不能为空错误
【发布时间】:2018-01-29 05:42:06
【问题描述】:

我收到此错误:System.ArgumentNullException:值不能为空。但这就是重点吗?如果.FreeAmount 为空,则应在AmountList 中检查选定的金额。但是这样做失败了。我真的看不出我在这里做错了什么。

var amount = string.IsNullOrEmpty(formModel.FreeAmount)
  ? formModel.AmountList
      .Where(x => x.Selected)
      .Select(a => a.Value)
      .SingleOrDefault()
  : formModel.FreeAmount;

【问题讨论】:

  • 你检查过formModel是否为空吗?
  • AmountList 中有 SelectedAmount 吗?
  • 请包括formModel 的班级以及AmountList 的班级。
  • @Kostis 如果fromModel 为空,那么您将获得NullReferenceException,而不是ArgumentNullException
  • 只是一个建议:formModel.AmountList.Where(x => x.Selected).DefaultIfEmpty(0).Select(a => a.Value).SingleOrDefault()

标签: c# lambda null conditional


【解决方案1】:

如果FreeAmountAmountList 都为空,您将只会在您发布的代码中获得System.ArgumentNullException。如果您想在这种情况下使用其他默认值,您可以执行以下操作:

var amount = string.IsNullOrEmpty(formModel.FreeAmount)
    ? formModel.AmountList == null
        ? "Default value if FreeAmount and AmountList are null"
        : formModel.AmountList
            .Where(x => x.Selected)
            .Select(a => a.Value)
            .SingleOrDefault()
    : formModel.FreeAmount;

否则,如果您只是希望它在这种情况下返回null(我认为这更有可能,因为目前SingleOrDefault 有可能)那么您可以只使用空条件运算符(?. ):

var amount = string.IsNullOrEmpty(formModel.FreeAmount)
    ? formModel.AmountList? // <-- The '?' will return null if AmountList is null
        .Where(x => x.Selected)
        .Select(a => a.Value)
        .SingleOrDefault()
    : formModel.FreeAmount;

【讨论】:

    【解决方案2】:

    在上述声明中,

    如果formModel为NULL,三元运算符的左边可能会导致NULL,

    所以,string.IsNullOrEmpty(formModel.FreeAmount) => 将导致 TRUE。

    因此,三元运算符将计算 : 符号的左侧(真),即,

    formModel.AmountList
          .Where(x => x.Selected)
          .Select(a => a.Value)
          .SingleOrDefault()
    

    这将导致 System.ArgumentNullException,因为 formModel 值为 null。

    因此,在 formModel 为 NULL 的情况下,命令将失败并出现 System.ArgumentNullException。

    【讨论】:

    • 这是不正确的。如果formModel 为空,那么formModel.FreeAmount 将抛出NullReferenceException。它永远不会执行string.IsNullOrEmpty,也不会到达三元运算符。
    • 如果formModel.FreeAmount 改为formModel?.FreeAmount,它可能会进入三元组——但即便如此,三元组仍会抛出NullReferenceException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    相关资源
    最近更新 更多