0

C# コードの行でいくつかの問題が発生しています。データベースで最終顧客の価格を取得しようとしています。null 許容の 10 進数なので、入力されていない場合は 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;dr: ?? の問題です。および ?: 64 ビット CLR JIT 内の 64 ビットより大きい null 許容構造体型 (Decimal、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 に答える