.NET - 非常奇怪的NullReferenceException?

发布于 2024-09-05 01:56:50 字数 314 浏览 4 评论 0原文

在以下场景中如何获得 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 查询结果,没有任何结果...

How can I get a NullReferenceException in the following scenario?

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

What am I missing here? Debug shows that langs is really just a LINQ queryresult without any results...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

葬心 2024-09-12 01:56:50

该异常可能来自 LINQ 查询的评估。 LINQ 查询以惰性方式求值:也就是说,在您实际使用该值之前,不会实际执行任何代码。

例如,如果您有以下内容(我不知道 VB 的 LINQ 语法,因此这是 C#,但同样的情况也适用):

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

此外,您永远不会从创建中返回 null LINQ 查询的一部分,因此不需要 If langs Is Nothing 检查。

The exception is probably coming from the evaluation of your LINQ query. LINQ queries are evaluated in a lazy fashion: that is, no code is actually executed until you actually use the value.

For example, if you have the following (I don't know the LINQ syntax for VB, so this is C# but the same thing applies):

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

Also, you will never get a null returned from the creation of the LINQ query so your If langs Is Nothing check is not needed.

栖迟 2024-09-12 01:56:50

因为 langs 在被访问之前不会被评估,所以您可以通过转换为列表来强制评估:

 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 

Because langs won't be evaluated until it is accessed, you can force the evaluation by converting to a list:

 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 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文