C# 十进制三进制不工作

C# 十进制三进制不工作,c#,C#,我试图用三元数来指定十进制类型。这对我不起作用。我疯了吗 这是我调试的屏幕截图。在我离开之前,你可以看到一切的价值。 我走了一步,这里是值。它甚至不是一个可行的选择(即1或2000)。 我不知道小数有什么奇怪的限制吗?当我把它分解成完整的if/else逻辑表示时,它工作得很好。我唯一能猜到的是我最近安装了.NETFramework 4.5 更新 我已经清理了解决方案,并确保按照注释中的建议,在调试模式下编译的代码上运行。这两件事似乎都没有改变什么 当我注意到我所有的单元测试仍然通过时,我开始

我试图用三元数来指定十进制类型。这对我不起作用。我疯了吗

这是我调试的屏幕截图。在我离开之前,你可以看到一切的价值。

我走了一步,这里是值。它甚至不是一个可行的选择(即1或2000)。

我不知道小数有什么奇怪的限制吗?当我把它分解成完整的if/else逻辑表示时,它工作得很好。我唯一能猜到的是我最近安装了.NETFramework 4.5

更新

我已经清理了解决方案,并确保按照注释中的建议,在调试模式下编译的代码上运行。这两件事似乎都没有改变什么

当我注意到我所有的单元测试仍然通过时,我开始感到好奇。经过进一步的调查,我发现当我再次跨过memberItems.Add时,price神奇地拥有了正确的价值


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

不可能从屏幕截图中诊断代码,所以只是一个猜测

你不能总是完全依赖手表表情告诉你的东西。第一种可能的故障模式是调试经过优化的代码。像price这样的局部变量通常由jitter优化器优化,存储在cpu寄存器而不是堆栈中。watch表达式将显示堆栈位置值,而不是cpu寄存器值。0是一个常见的结果。针对这种情况的唯一真正防御措施是调试配置生成的代码


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

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


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

进行“清理”,然后重建。有时调试信息与实际可执行文件的代码不同步。请确保您是在调试模式下运行,而不是在发布模式下运行。还要验证您锁定的
price
不是错误地锁定了同名的成员变量。@dasblinkenlight good one on pinning error variable<代码>价格在第一个屏幕截图上不应该是
0
,它还没有初始化。我能给你的最好建议是不要使用三元运算符。三元结构简洁明了,让大多数人感到困惑,难以阅读,也没有比简单的if-then-else更有用。@MichaelAllen这是什么世界上的“最佳建议”?Trimal是为类似的案例而创建的,它是目前为止最好的工作工具。我不认为您提到的任何可能的问题与我的案例相关,但它比我知道的要详细得多,所以谢谢。也只是好奇你是从哪里学到这些的?有什么特别的文章吗?或者你是多年来才读到的?