C# 空引用异常的奇数位置
我有以下代码片段:C# 空引用异常的奇数位置,c#,C#,我有以下代码片段: 1. var x = item.Current.DeepProperty; 2. var current = item.Current as IFoo; 3. if (current == null) 4. continue 5. var y = item.Bar.Baz 我在第3行上得到运行时空引用异常 有人能解释为什么吗 我有正确的PDB,程序集是在发布模式下编译的,并启用了优化 更新我发布了一个未优化的版本,发现抛出的是第5行 谢谢,第3行无法触发空引用异常。发
1. var x = item.Current.DeepProperty;
2. var current = item.Current as IFoo;
3. if (current == null)
4. continue
5. var y = item.Bar.Baz
我在第3行
上得到运行时空引用异常
有人能解释为什么吗
我有正确的PDB,程序集是在发布模式下编译的,并启用了优化
更新我发布了一个未优化的版本,发现抛出的是第5行
谢谢,第3行无法触发空引用异常。发布版本正在优化代码,从而更改行号。如果
item
或item.Current
为null
则会出现该异常
然而,优化器通常会从构建中删除行,因此异常更可能来自后面的行
为了找到确切的源代码,您需要在调试版本中重现错误。或者添加更多空检查和日志记录。第3行无法触发空引用异常。发布版本正在优化代码,从而更改行号。如果
item
或item.Current
为null
则会出现该异常
然而,优化器通常会从构建中删除行,因此异常更可能来自后面的行
为了找到确切的源代码,您需要在调试版本中重现错误。或者添加更多的空检查和日志记录。好吧,在发布模式下,无法保证执行的代码与您编写的代码完全一致;在启用优化时,将调试信息视为更多的指导原则。在本例中,异常几乎可以肯定是由于第2行的
item.Current
引起的。我昨天在java应用程序中遇到了一个非常类似的问题——检查null行上的NullPointerException。我将继续关注这一点——谁知道呢,答案可能会对我的问题有所帮助。@Cameron,如果item.Current
是问题所在,那么异常在到达第2行之前不会从第1行抛出吗?看着你的问题标题,我想不出你在“NRE”上说的是什么。你能编辑一下吗?没有问题的主体作为上下文是没有意义的。@Brian:Oops,你当然是对的(除非有奇怪的诡计,item.Current
每次访问时都会更改值)。不过,仔细想想,编译器/JITer可以轻松地对这两行代码重新排序……好吧,在发布模式下,无法保证执行的代码与您编写的代码完全一致;在启用优化时,将调试信息视为更多的指导原则。在本例中,异常几乎可以肯定是由于第2行的item.Current
引起的。我昨天在java应用程序中遇到了一个非常类似的问题——检查null行上的NullPointerException。我将继续关注这一点——谁知道呢,答案可能会对我的问题有所帮助。@Cameron,如果item.Current
是问题所在,那么异常在到达第2行之前不会从第1行抛出吗?看着你的问题标题,我想不出你在“NRE”上说的是什么。你能编辑一下吗?没有问题的主体作为上下文是没有意义的。@Brian:Oops,你当然是对的(除非有奇怪的诡计,item.Current
每次访问时都会更改值)。不过,仔细想想,编译器/JITer可以很容易地对这两行进行重新排序……因此推测它的第1行正在抛出。优化器可能对我的代码做了什么导致了这种结果?==运算符的糟糕实现不可能导致第3行出现NRE吗?只要生成的代码是等效的,优化器几乎可以做任何它想做的事情。没有办法从你发布的片段中分辨出来。正如注释中所建议的,在发布模式中将行号视为一个粗略的指导原则。@Rawling运算符可以抛出该异常,但该异常将来源于运算符代码,而不是调用代码(除非优化器决定内联运算符代码,这似乎很奇怪),因此推测它的第1行正在抛出。优化器可能对我的代码做了什么导致了这种结果?==运算符的糟糕实现不可能导致第3行出现NRE吗?只要生成的代码是等效的,优化器几乎可以做任何它想做的事情。没有办法从你发布的片段中分辨出来。正如注释中所建议的,在发布模式中将行号视为一个粗略的指导原则。@Rawling运算符可以引发该异常,但该异常将来源于运算符代码,而不是调用代码(除非优化器决定内联运算符代码,这似乎很奇怪)