我有一个可为 null 的整数属性在 VB.NET 中。
代码中的此属性具有正确的值,但在QuickWatch
始终显示1
,除非我用一个值开头,然后显示六个洋地黄数字。
我的代码是:
Public Property MyNumber As Integer?
MyNumber = 6546
MessageBox.Show(MyNumber.ToString())
![QuickWatch1](https://i.stack.imgur.com/I5l7N.png)
And for 可空的双重属性 in QuickWatch
始终显示4/94065645841247E-324
.
![QuickWatch2](https://i.stack.imgur.com/HHnhP.png)
我测试这个.Net 4 & 4.5
on visual studio 2010 & 2013
并得到相同的结果。不过C#没有这个问题
EDIT:
I append my project result too, as you see in watch windows both of them is shown
![QuickWatch3](https://i.stack.imgur.com/WekvG.png)
为什么会出现这种情况?
EDIT:
此问题存在于 .Net 4、4.5 和 4.5.1 中。用.Net 2.0和3.5都没有问题
经确认,这确实是调试器中的一个错误。我搜索了 connect.microsoft.com,没有找到类似的东西,这并不是一个让很多 VB.NET 程序员感到震惊的错误。这并不完全令人惊讶,只有当您将 .ToString() 附加到可为空的变量名称时才会出错。从来没有人这样做过。
这不是您可以在此站点上获得任何帮助的错误,而是 Microsoft 需要修复的错误。
稍微描述一下这个 bug,这似乎是在调试器内置的 VB.NET 特定表达式解析器中出现的问题。您无法在 C# 项目中重现此问题的原因。为什么进程的位数并不重要,64 位调试器也会显示错误的值。一般来说,这是一段变化无常的代码,微软一直在努力将其淘汰。基本问题是他们必须在调试器中构建相当于 VB.NET 编译器的组件,以便可以解析这些表达式。但有限制的是,该解析器几乎不支持整个语言。副作用是调试器运行的代码可能与您的程序运行的代码不同。
Nullable(Of T).ToString() 的代码生成相当棘手,它需要条件装箱转换。解析器会针对任何此类表达式进行错误处理,请注意如何MyNumber.GetHashCode()
也会产生错误的值。和MyNumber.Equals(5456.0)
。需要装箱转换的表达式类型。
从技术上讲,您也可以在 connect.microsoft.com 上报告此错误,但我不建议花时间。如前所述,微软一直在努力淘汰这个解析器,这最终发生了。由 Roslyn 提供支持,这是一种可在任何地方使用的编译服务。它已集成到 VS2015 中,据了解调试器也使用它。不是 100% 确定,9 天后我就会知道 VS2015 何时发布。也许安装了 beta/RC 版本的人可以通过评论进行确认。
更新:确认已在 VS2015 上修复。
同时,在您可以更新之前,解决方法是停止对快速/监视表达式中的可为空变量使用 ToString()。这是越野车。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)