十进制三元不工作

时间:2012-08-22 13:43:31

标签: c#

我正在尝试使用三元组来指定小数类型。它不适合我。我疯了吗?

这是我的调试的屏幕截图。在我迈步之前你可以看到一切的价值。 enter image description here

我走到这里之后是价值。它甚至不是可行的选择之一(即1或2000)。 enter image description here

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

更新

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

当我注意到我的所有单元测试仍在通过时,我开始变得好奇。经过一段时间的调查后,我发现当我再踏上一次(即跳过memberItems.Add)时,价格神奇地具有正确的价值。

.Net是否对迭代器块中的yield命令执行某种类似延迟解决的三元运算符?我以前从未注意到它,但我不知道它还能是什么。我想我仍然可能会在发布模式下意外运行代码。我在三次检查之后犯了笨拙的错误。

2 个答案:

答案 0 :(得分:6)

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

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

第二种失败模式是评估监视表达式的方式。 CLR在检测到连接的调试器时启动专用线程。然后,调试器可以使用此线程来评估监视表达式。如果变量具有任何线程关联,则可能会出错。常见情况是[ThreadStatic]变量或COM对象的属性。

答案 1 :(得分:0)

我遇到了同样的问题,我也以为自己疯了。

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