提问人:PhillyD 提问时间:1/29/2020 最后编辑:PhillyD 更新时间:1/30/2020 访问量:1200
System.NullReferenceException 使用 null 合并运算符时出现异常
System.NullReferenceException when using null coalescing operator
问:
我遇到了一个似乎无法修复的错误。在对 Stack Overflow 进行了一些研究后,似乎 null 合并运算符是解决我问题的方法,但它没有帮助。下面是给出错误的代码:
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);
}
当我运行这段代码时,我得到:
异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。
来自线.我添加了 null 合并运算符来检查 null 值,但这并不能解决我的问题。错误是因为没有批准,所以我假设 linq 方法将返回默认值,当它意识到默认值为 时,它将使用 null 合并运算符返回运算符右侧的空字符串。result.ApproverName = approval.Results.FirstOrDefault().Name ?? "";
Results
FirstOrDefault
Name
""
如果我遗漏了什么,请告诉我,因为我似乎不明白为什么即使在添加 null 合并运算符时也会出现此错误。
编辑:正如评论中所建议的那样,查看这篇文章帮助我更多地了解了为什么我收到此错误。虽然问题有点不同,但我强烈建议您阅读答案以全面了解我的问题。
答:
每次通话后,您都需要添加接线员。这是一个完整的解决方案:.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);
}
如果结果的其他部分可能为空,您可以走完全偏执的路线
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);
}
偏执狂和 LINQ 化:
var results = OperationsReviewers.ApprovalItems
.Select(approval => new OperationsReviewLevelResult
{
ApproverName = approval?.Results?.FirstOrDefault()?.Name ?? "",
ReviewLevel = approval?.Name,
Comment = approval?.Results?.FirstOrDefault()?.Comments ?? ""
}
.ToList();
最可能的原因是返回(作为默认值),从而引发异常。
您可以借助以下方法尝试 null 传播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 ?? "",
});
所以如果是空的,因此返回,然后返回,最终变成approval.Results
FirstOrDefault()
null
FirstOrDefault()?.Name
null
""
评论
.FirstOrDefault()?.
FirstOrDefault()
null
Name
null
approval
approval.Results
approval.Results.FirstOrDefault()
approval.Results
FirstOrDefault()
null
= approval.Results.FirstOrDefault()?.Name ?? "";
= approval?.Results?.FirstOrDefault()?.Name ?? "";
a ?? b
a
null
a
null
b