为什么调试器/运行时不能告诉我哪个对象为null?

时间:2014-05-29 14:34:51

标签: c# visual-studio debugging visual-studio-2013 nullreferenceexception

代码:

items.FirstOrDefault(x => x.Foo.Bar.BarId == snuh.BarId);

错误:

  

System.NullReferenceException:未将对象引用设置为实例   一个对象。

null对象可以是itemsFooBarsnuh

调试器/运行时可以告诉我发生错误的代码行。为什么它也不能告诉我哪个对象是问题?

注意:我知道我可以调试这个并找到答案。有没有理由Visual Studio无法向我提供违规对象的名称?

3 个答案:

答案 0 :(得分:3)

因为调试器或编译器具有源符号,所以他们可以将名称映射到地址。

然而,运行时不知道如何在源代码中命名引用(它已被编译)。

请注意,如果您(而不是CLR)抛出了NullReferenceException,那么您可以在嵌入消息中添加任何信息。

答案 1 :(得分:2)

由于优化等,“存储在寄存器R22中的此引用/位于堆栈槽5中”与实际获得该引用的方式之间的关系可能很难推断出来。

所有它知道,此刻,有人试图取消引用它,结果证明是NULL

通常情况下,它试图取消引用的内容也可能在源代码中没有明确/可理解的名称。

答案 2 :(得分:0)

在大多数语言中接收空指针但不指定对象很常见。我很确定它是因为它无法在第一时间找到对象以告诉你它是什么。