6

我正在尝试使用三元来分配十进制类型。它不适合我。我要疯了吗?

这是我调试的屏幕截图。在我迈出之前,您可以看到一切的价值。 在此处输入图像描述

在我走到这里之后就是价值。它甚至不是可行的选项之一(即 1 或 2000)。 在此处输入图像描述

小数有一些我不知道的奇怪限制吗?当我将其分解为完整的 if/else 逻辑表示时,它可以正常工作。我唯一能猜到的是我最近安装了 .NET Framework 4.5。

更新

我已经清理了解决方案,并确保我正在按照评论中的建议在调试模式下编译的代码上运行。这些似乎都没有改变任何东西。

当我注意到我所有的单元测试仍然通过时,我开始感到好奇。经过一番调查后,我发现当我再走一步(即跨过 memberItems.Add)时,价格神奇地具有正确的价值。

.Net 是否对三元运算符进行某种延迟解析,类似于迭代器块中的 yield 命令?我以前从未注意到它,但我不知道它还能是什么。我想我也可能意外地在发布模式下编译的代码上运行。在三重检查自己之后,我犯了更愚蠢的错误。

4

2 回答 2

6

无法从屏幕截图中诊断代码,所以只是猜测。

您不能总是完全依赖手表表达式告诉您的内容。第一种可能的故障模式是调试经过优化的代码。像价格这样的局部变量通常会由抖动优化器优化,以存储在 cpu 寄存器而不是堆栈中。watch 表达式将显示堆栈位置值,而不是 cpu 寄存器值。0 是一个常见的结果。您对此唯一真正的防御就是调试由 Debug 配置构建的代码。

第二种故障模式是评估监视表达式的方式。当 CLR 检测到附加的调试器时,它会启动一个专用线程。然后调试器可以使用这个线程来评估监视表达式。如果变量具有任何线程亲和性,这可能会出错。常见情况是 [ThreadStatic] 变量或 COM 对象的属性。

于 2012-08-22T15:15:52.770 回答
0

我有同样的问题,我还以为我要疯了。

我发现将我的 ASP.NET 应用程序更改为使用“Visual Studio Developer Server”而不是 IIS 可以修复它。可惜,因为我喜欢使用 IIS,因为这更接近生产中发生的事情。

于 2014-03-20T03:47:14.750 回答