IEnumerable不是没有,但在迭代时返回null引用异常(C#)

时间:2016-10-12 19:43:01

标签: c# foreach ienumerable nullreferenceexception

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

  

ienumerable抛出了类型'System.NullReferenceException

的异常
if (ienumerable != null)
{
    foreach (var item in ienumerable)
    {
        ......
    }
}

我在foreach循环之前进行了一次空检查,并且iEnumerable传递了null检查,但是当我在它上面运行foreach循环时,它会抛出空引用异常。

2 个答案:

答案 0 :(得分:3)

迭代器可以在迭代时执行任何操作,包括抛出异常。所以基本上,你需要知道源是什么。例如,这是一个以相同方式抛出的非null迭代器:

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

直到第二次循环才会失败。所以:看一下迭代器的来源,以及如何实现迭代器。

纯粹是为了好玩,这是另一个同样失败的原因:

IEnumerable<int> GetLengths() {
    yield return 3;
    throw new NullReferenceException();
}

答案 1 :(得分:0)

你的ienumerable中的项目有时为空,

试试这个:

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

        }
    }

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

        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();