QuickWatch 无法正常显示可空属性的“.ToString()”

QuickWatch is not work correctly for show ".ToString()" of Nullable properties

我在 vb.net 中有一个 可为 null 的整数 属性
这个 属性 在代码中有正确的值,但在 QuickWatch 中总是显示 1,除非我用一个值初始化它然后显示六个洋地黄数字。

我的代码是:

Public Property MyNumber As Integer?

MyNumber = 6546

MessageBox.Show(MyNumber.ToString())

而对于 nullable double 属性 in QuickWatch 始终显示 4/94065645841247E-324.

我在 .Net 4 & 4.5visual studio 2010 & 2013 上进行了测试,结果相同。但是C#没有这个问题

编辑:

我也附加了我的项目结果,正如你在手表中看到的那样windows它们都显示了

为什么会这样?

编辑:

此问题与 .Net 4、4.5 和 4.5.1 有关。使用 .Net 2.0 和 3.5 没有问题

确认,这确实是调试器的一个bug。我搜索了 connect.microsoft.com 并没有找到任何类似的东西,这不是一个让许多 VB.NET 程序员感到震惊的错误。不足为奇,只有当您将 .ToString() 附加到可为空的变量名称时,这才会出错。从来没有人这样做过。

这不是您可以在此站点获得任何帮助的错误,它是 Microsoft 需要修复的错误。

稍微描述一下错误,这似乎在调试器内置的 VB.NET 特定表达式解析器中出错。您无法在 C# 项目中重现这一点的原因。为什么进程的位数无关紧要,64 位调试器也显示错误的值。这通常是 Microsoft 一直致力于淘汰的一段变化无常的代码。基本问题是他们必须将 VB.NET 编译器的等价物构建到调试器中,以便可以解析这些表达式。虽然有限,但该解析器几乎不支持整个语言。副作用是调试器运行的代码可能与您的程序运行的代码不同。

Nullable(Of T).ToString() 的代码生成相当棘手,它需要条件装箱转换。对于任何这样的表达式,解析器都会混淆它,请注意 MyNumber.GetHashCode() 也是如何产生错误值的。并且 MyNumber.Equals(5456.0)。那种需要装箱转换的表达式。

您也可以在 connect.microsoft.com 技术上报告此错误,但我不建议您花时间。如前所述,Microsoft 一直致力于淘汰此解析器,并且最终实现了这一目标。由 Roslyn 提供支持,这是一种可在任何地方使用的编译服务。它被集成到 VS2015 中,据了解调试器也使用它。不是 100% 确定,我会在 9 天后 VS2015 发布时知道。也许安装了 beta/RC 版本的人可以通过评论确认。

更新:已确认已在 VS2015 上修复。

同时,在您可以更新之前,解决方法是停止对 quick/watch 表达式中可为空的变量使用 ToString()。这是越野车。