gpt4 book ai didi

c# - Foreach 在带有元素的非空 IEnumerable 上抛出 NullReferenceException

转载 作者:行者123 更新时间:2023-12-05 02:52:15 24 4
gpt4 key购买 nike

我在我的代码中遇到过与下面代码中出现的情况类似的情况。问题是由于某种原因在 foreach 循环中迭代会抛出 NullReferenceException

我的问题是,为什么会这样?

如果我自己创建返回空元素的迭代器,foreach 会处理它,并简单地打印 空行。

以下代码的结果是:test, test, NullReferenceException

using System;
using System.Collections.Generic;
using System.Linq;

public class NestedB
{
public string Test {get;set;}
}

public class NestedA
{
public List<NestedB> NestedCollection {get;set;}
}

public class Program
{
public static void Main()
{
var listOfA = new List<NestedA>
{
new NestedA
{
NestedCollection = new List<NestedB>
{
new NestedB {Test = "test"},
new NestedB {Test = "test"}
}
},
new NestedA ()
};

var listOfB = listOfA.SelectMany(x => x.NestedCollection);

foreach (var item in listOfB)
{
if (item != null)
{
Console.WriteLine(item.Test);
}
}
}

}

堆栈跟踪:

Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at System.Linq.Enumerable.SelectManySingleSelectorIterator`2.MoveNext()
at Program.Main()
Command terminated by signal 6

最佳答案

问题是:

listOfA.SelectMany(x => x.NestedCollection)

您的第二个 NestedA 实例没有 NestedCollection,因此它正在尝试查找“空引用中的所有项目”。如果您手动执行此操作,您将遇到完全相同的问题:

var nestedA = new NestedA();
// This will throw an exception, because nestedA.NestedCollectoin is null
foreach (var nestedB in nestedA.NestedCollection)
{
}

对此最简单的解决方法是将 NestedCollection 设置为只读属性,但将其初始化为:

public List<NestedB> NestedCollection { get; } = new List<NestedB>();

然后您需要修改第一个 NestedA 的初始化以使用集合初始化程序:

new NestedA
{
NestedCollection =
{
new NestedB { Test = "test" },
new NestedB { Test = "test" }
}
}

如果您不想这样做,您可以改为更改SelectMany调用:

var listOfB = listOfA.SelectMany(x => x.NestedCollection ?? Enumerable.Empty<NestedB>())

关于c# - Foreach 在带有元素的非空 IEnumerable 上抛出 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62690247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com