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;

谢谢!

4

1 回答 1

1

我找到了一篇解释调试器问题的博文,其中包括 Microsoft 的回复:

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

Tl; 博士:这是 ?? 的问题 和 ?:64 位 CLR JIT 中大于 64 位(十进制、Guid、...)的可空结构类型的运算符,其值在下一条语句之前不会更新。它已在 VS2012 中修复。

如果您对简单的复制感兴趣,只需在 VS2010 的 64x 调试中运行它:

Decimal? foo = 10.5m;
var result = foo.HasValue ? foo.Value : 0;
Console.WriteLine(result);

将断点放在 Console.Writeline 行上。将鼠标悬停在结果上并查看 0。如果我们之前为结果定义并分配了一个值,它仍然会显示旧值。在立即执行窗口的监视中使用结果时,它仍将使用旧值。移至下一行,您将看到值更新。

于 2013-04-25T09:23:02.637 回答