.NET - 非常奇怪的NullReferenceException?

时间:2010-06-08 01:10:52

标签: vb.net linq nullreferenceexception

如何在以下场景中获得NullReferenceException

 Dim langs As IEnumerable(Of SomeCustomObject) = //some LINQ query
 If langs Is Nothing Then Return Nothing 
 If langs.Count = 1 Then //NullReferenceException here

我在这里缺少什么?调试显示langs实际上只是一个没有任何结果的LINQ查询结果......

2 个答案:

答案 0 :(得分:9)

异常可能来自对LINQ查询的评估。 LINQ查询以惰性方式进行评估:即,在实际使用值之前,实际上不会执行任何代码。

例如,如果你有以下内容(我不知道VB的LINQ语法,所以这是C#,但同样适用):

string str = null;
IEnumerable<char> chs = from ch in str select ch;
if (chs.Count() == 0) // NullReferenceException here

此外,您永远不会从创建LINQ查询返回null,因此不需要进行If langs Is Nothing检查。

答案 1 :(得分:0)

因为在访问lang之前不会对其进行评估,所以您可以通过转换为列表来强制进行评估:

 Dim langs As IEnumerable(Of SomeCustomObject) = //some LINQ query 
 Dim langsList as List(Of SomeCustomObject) = langs.ToList()
 If langsList Is Nothing Then Return Nothing  
 If langsList.Count = 1 Then //NullReferenceException here