使用空合并运算符时的 System.NullReferenceException

Phi*_*lyD 1 .net c# linq nullreferenceexception

我遇到了一个我似乎无法修复的错误。在对 Stack Overflow 进行了一些研究之后,似乎空合并运算符可以解决我的问题,但它并没有帮助。这是给出错误的代码:

List<OperationsReviewLevelResult> results = new List<OperationsReviewLevelResult>();
foreach (var approval in OperationsReviewers.ApprovalItems)
{
     var result = new OperationsReviewLevelResult();
     result.ApproverName = approval.Results.FirstOrDefault().Name ?? "";
     result.ReviewLevel = approval.Name;
     result.Comment = approval.Results.FirstOrDefault().Comments ?? "";
     results.Add(result);
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我得到:

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

从行而来result.ApproverName = approval.Results.FirstOrDefault().Name ?? "";。我添加了空合并运算符来检查空值,但这并没有解决我的问题。错误是因为没有Resultsin批准所以我假设FirstOrDefaultlinq方法会返回默认值,当它意识到默认值有一个空值时Name,它会使用空合并运算符返回""右侧的空字符串运营商的。

如果我遗漏了什么,请告诉我,因为我似乎无法理解为什么即使添加空合并运算符也会收到此错误。

编辑:正如评论中所建议的,查看这篇文章帮助我更多地了解我收到此错误的原因。虽然问题有点不同,但我强烈建议阅读答案以全面了解我的问题。

Kit*_*Kit 7

每次.FirstOrDefault()通话后,您都需要添加?.接线员。这是一个完整的解决方案:

List<OperationsReviewLevelResult> results = new List<OperationsReviewLevelResult>();
foreach (var approval in OperationsReviewers.ApprovalItems)
{
     var result = new OperationsReviewLevelResult();
     result.ApproverName = approval.Results.FirstOrDefault()?.Name ?? "";
     result.ReviewLevel = approval.Name;
     result.Comment = approval.Results.FirstOrDefault()?.Comments ?? "";
     results.Add(result);
}
Run Code Online (Sandbox Code Playgroud)

如果结果的其他部分可能为空,您可以走完整的偏执路线

List<OperationsReviewLevelResult> results = new List<OperationsReviewLevelResult>();
foreach (var approval in OperationsReviewers.ApprovalItems)
{
     var result = new OperationsReviewLevelResult();
     result.ApproverName = approval?.Results?.FirstOrDefault()?.Name ?? "";
     result.ReviewLevel = approval?.Name;
     result.Comment = approval?.Results?.FirstOrDefault()?.Comments ?? "";
     results.Add(result);
}
Run Code Online (Sandbox Code Playgroud)

和偏执和 LINQ 化:

var results = OperationsReviewers.ApprovalItems
    .Select(approval => new OperationsReviewLevelResult
    {
        ApproverName = approval?.Results?.FirstOrDefault()?.Name ?? "",
        ReviewLevel = approval?.Name,
        Comment = approval?.Results?.FirstOrDefault()?.Comments ?? ""
    }
    .ToList();
Run Code Online (Sandbox Code Playgroud)


Dmi*_*nko 7

最可能的原因是,FirstOrDefault()返回null(作为默认值),并且因此FirstOrDefault().Name抛出异常。您可以在以下帮助下尝试空传播?.

   foreach (var approval in OperationsReviewers.ApprovalItems)
     results.Add(new OperationsReviewLevelResult() {
       ApproverName = approval.Results.FirstOrDefault()?.Name ?? "",
       ReviewLevel  = approval.Name,
       Comment      = approval.Results.FirstOrDefault()?.Comments ?? "",
     });
Run Code Online (Sandbox Code Playgroud)

所以如果approval.Results空的,因此FirstOrDefault()返回null然后 FirstOrDefault()?.Name返回null,最终变成""