C# 条件 lambda 而不是 if 语句。值不能为空错误

C# conditional lambda instead of if statements. Value cannot be null error

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

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

如果 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;

否则,如果您只想在这种情况下 return 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;

在上面的语句中,

如果 formModel 为 NULL,则三元运算符的左 had 侧可能导致 NULL,

因此,string.IsNullOrEmpty(formModel.FreeAmount) => 将得到 TRUE。

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

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

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

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