为什么空引用异常不能命名具有空引用的对象?

Yes*_*ke. 12 .net theory compiler-construction exception

在我看来,我的很多调试时间花在追踪复杂语句中的空引用异常上.例如:

For Each game As IHomeGame in _GamesToOpen.GetIterator()
Run Code Online (Sandbox Code Playgroud)

为什么,当我得到NullReferenceException时,我可以获取堆栈跟踪中的行号,但不能获取等于null的对象的名称.换句话说,为什么:

Object reference not set to an instance of an object.
Run Code Online (Sandbox Code Playgroud)

代替

_GamesToOpen is not set to an instance of an object.
Run Code Online (Sandbox Code Playgroud)

要么

Anonymous object returned by _GamesToOpen.GetIterator() is null.
Run Code Online (Sandbox Code Playgroud)

要么

game was set to null.
Run Code Online (Sandbox Code Playgroud)

这是一个严格的设计选择,是为了保护代码的匿名性,还是编译器设计中有一个令人信服的理由不在调试时异常中包含这些信息?

Meh*_*ari 11

例外是运行时事物,变量是编译时间的东西.

实际上,示例中的变量是一个表达式.表达式并不总是简单的变量.在运行时,将计算表达式,并在结果对象上调用该方法.如果该表达式的值为null,则运行时将抛出一个NullReferenceException.假设如下:

Dim a as New MyObject
Dim b as String = MyObject.GetNullValue().ToString()
Run Code Online (Sandbox Code Playgroud)

如果GetNullValue()方法返回,运行时应返回什么错误消息null

  • 行号也是运行时的事情.调试时编译包含各种编译时的事物(类和方法名称,行号等)为什么不是变量名? (2认同)
  • 类和方法以及参数名称实际上确实存在于 IL 级别。但是变量在生成的 IL 中几乎消失了。基本上,没有将异常与特定变量相关联的特定方法:假设“if (a < b) throw ...;” 问题与“a”还是“b”有关? (2认同)
  • 变量名称在 PDB 符号中,因此它们可用(在调试模式下)。这就是 Reflector 显示它们的方式。至少,IDE 可以开始显示哪个语句返回了 null。 (2认同)
  • 表达式应该有一个“范围”,因此调试器应该能够让您知道表达式“MyObject.GetNullValue()”为空。 (2认同)