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

问题描述 投票:0回答:1

我遇到了似乎无法修复的错误。在对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);
}

运行此代码时,我得到:

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

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

[请让我知道我是否缺少某些内容,因为即使添加空合并运算符,我似乎也无法理解为什么会收到此错误。

c# .net linq nullreferenceexception
1个回答
0
投票

在每个.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);
}

0
投票

最可能的原因是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 ?? "",
     });
© www.soinside.com 2019 - 2024. All rights reserved.