一行有奇怪的C#行为

时间:2013-04-25 07:45:54

标签: c#-4.0

我遇到了一系列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;

谢谢!

1 个答案:

答案 0 :(得分:1)

我发现了一篇博客文章,解释调试器问题,包括微软的回复:

http://geekswithblogs.net/twickers/archive/2011/03/31/misreporting-of-variable-values-when-debugging-x64-code-with-the.aspx

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.如果我们之前定义并为结果赋值,则仍会显示旧值。在立即执行窗口的监视中使用结果时,它仍将使用旧值。移至下一行,您将看到值更新。