IEnumerable 不为 null,但在迭代时抛出 NullReferenceException

Eri*_*ert 6 c# ienumerable foreach nullreferenceexception

我有一个 IEnumerable,我在其上运行 foreach。它在 foreach 行的某些情况下抛出空引用异常,它说

ienumerable 引发了“System.NullReferenceException”类型的异常

if (ienumerable != null)
{
    foreach (var item in ienumerable)
    {
        ......
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 foreach 循环之前进行了空检查,并且 iEnumerable 通过了空检查,但是当我在其上运行 foreach 循环时,它会抛出空引用异常。

Mar*_*ell 5

迭代器在迭代时几乎可以做任何事情,包括抛出异常。所以基本上,你需要知道来源是什么。例如,这是一个以相同方式抛出的非空迭代器:

var customers = new [] {
    new Customer { Name = "abc" },
    new Customer { },
    new Customer { Name = "def" }
};
IEnumerable<int> lengths = customers.Select(x => x.Name.Length);
Run Code Online (Sandbox Code Playgroud)

直到第二次循环才会失败。所以:看看迭代器从哪里来,以及迭代器是如何实现的。

纯粹为了好玩,这是另一个同样会失败的例子:

IEnumerable<int> GetLengths() {
    yield return 3;
    throw new NullReferenceException();
}
Run Code Online (Sandbox Code Playgroud)


C S*_*ith 1

你的可枚举项有时为空,

尝试这个:

    if (ienumerable != null)
    {
        foreach (var item in ienumerable)
        {
            if(item != null)
            {
               // do stuff
            }

        }
    }
Run Code Online (Sandbox Code Playgroud)

这是一个供你们尝试的例子。

        string[] testStr = new string[] { null, "", "test" };
        foreach (var item in testStr)
        {
            if (item != null)
            {
                Console.WriteLine(item);
            }
            else
            {
                Console.WriteLine("item was null");
            }
        }

        Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)