我遇到了一系列C#代码的问题。 我正试图在我们的数据库中获得最终客户的价格。它是一个可以为零的小数,所以如果没有填写,我使用0。
有人可以查看这行代码,并解释为什么这不起作用?
这是具体的一行:
Decimal totalPrice = requestedPrice.EndCustomerAmount.HasValue ? requestedPrice.EndCustomerAmount.Value : 0;
问题在于,对于某些价格,即使EndCustomerAmount具有值,totalPrice也为0。
如果我调试代码并在立即窗口中执行if语句,则返回正确的值。即使我在立即窗口中指定值,totalPrice变量也保持正确的数量。
我尝试过以下几行解决问题,但没有运气:
Decimal totalPrice = requestedPrice.EndCustomerAmount ?? 0;
而且:
Decimal totalPrice = requestedPrice.EndCustomerAmount ?? 0m;
而且:
Decimal totalPrice = 0
totalPrice = requestedPrice.EndCustomerAmount.HasValue ? requestedPrice.EndCustomerAmount.Value : 0;
这似乎有用:
Decimal totalPrice = 0
if(requestedPrice.EndCustomerAmount.HasValue)
totalPrice = requestedPrice.EndCustomerAmount
或者这个:
Decimal? totalPrice = requestedPrice.EndCustomerAmount.HasValue ? requestedPrice.EndCustomerAmount.Value : 0;
谢谢!
答案 0 :(得分:1)
我发现了一篇博客文章,解释调试器问题,包括微软的回复:
Tl;博士:这是一个问题?和?:64位CLR JIT中大于64位(Decimal,Guid,...)的可空结构类型的运算符,其值在下一个语句之前不会更新。它已在VS2012中修复。
如果您对简单的再现感兴趣,只需在VS2010的64x调试中运行:
Decimal? foo = 10.5m;
var result = foo.HasValue ? foo.Value : 0;
Console.WriteLine(result);
将断点放在Console.Writeline行上。将鼠标悬停在结果上并查看0.如果我们之前定义并为结果赋值,则仍会显示旧值。在立即执行窗口的监视中使用结果时,它仍将使用旧值。移至下一行,您将看到值更新。