9

Nullable<decimal>を返すゲッター/セッターWebControlを実装するカスタムがあります.Value

これは、クライアント側でフィルタリングされたテキストボックスです(TextBoxJavaScriptが含まれているサブクラスと、値を設定/取得するためのサーバー側のロジックが含まれています)

これがそのコントロールのゲッターとセッターです。

public decimal? Value
{
    get
    {
        decimal amount = 0;
        if (!decimal.TryParse(this.Text, NumberStyles.Currency, null, out amount))
        {
            return null;
        }
        else
        {
            return amount;
        }
    }
    set
    {
        if (!value.HasValue)
        {
            this.Text = "";
        }
        else
        {
            this.Text = string.Format("${0:#,##0.00}", value);
        }
    }
}

私が見ている問題は、このステートメントからの出力です。

decimal Amount = uxAmount.Value ?? 0M;

uxAmount.Value10000を返すと、金額が「0」に設定されているのがわかります。

これは私が期待したように機能しました(ケーシングの変更を許してください):

decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;

また、Linq2Sqlデータコンテキストで定義されたUDF関数をnull合体演算子とともに呼び出すときにこの動作を(最近)見ました。つまり、UDF呼び出しが期待値を返すことはわかっていましたが、代わりにRHS値を取得していました。

さらに混乱しますが、時計でuxAmount.Valueを評価すると、タイプが10000になりNullable<decimal>ます。

これが私が試したいくつかの表現です:

decimal? _Amount = uxAmount.Value; //10000
decimal amount = _Amount ?? 0; //10000
decimal amount2 = _Amount ?? 0M; //10000
decimal Amount = uxAmount.Value ?? 0M; //0

次に、上記の4に続いてこの式を追加しました

decimal amount3 = (uxTaxAmount.Value) ?? 0M;

decimal Amount = uxAmount.Value ?? 0M; //10000
decimal amount3 = (uxAmount.Value) ?? 0M; //0

最後の呼び出しは常に0のようですが、 ( aを使用して上記のgetter / setterのようuxAmount.Valueに解析されます。ブレークポイントで停止し、この値を操作できるスレッドは他にありません。.TextTryParse

定数は整数であり、型変換の問題が疑われたため、定数を10進数にするためにM接尾辞を使用していることに注意してください。

何か案は?

LHSとRHSの両方の値は安定しており、既知であるように見えます。

--編集--VS2010からのいくつかのスクリーングラブ

amount3の値を示すコードをステップスルーします

ダイアログと変数の状態に関する詳細を見る

4

2 に答える 2

1

この同様の質問を見てください

null許容型で合体null演算子を使用すると、暗黙の型が変更されます

どうして

decimal amount = uxTaxAmount.Value.HasValue ? uxTaxAmount.Value.Value : 0M

最近の編集やコメントを考えると、これは元のポスターの問題に対する正しい答えではありません。

于 2012-08-14T21:43:23.297 に答える
1

(この回答は、上記の私のコメントから作成されました。)

デバッガーがこれを正しく表示しますか?の値が更新されていることを確認するために、さらにいくつかの行をステップダウンしてみましたamount3か?

デバッガーの問題だと思います。時々あなたはもう少し一歩踏み出さなければなりません。たぶん、翻訳されたコード(IL)には、デバッガー(または私が知っていること)を混乱させるいくつかの最適化があります。ただし、デバッガーがないと、値は期待どおりに正確に更新されます。

他の経験豊富な開発者が同様の状況で混乱しているのを見たことがあるので、ローカル変数への割り当てを見ると、デバッガーが「1行のコード」遅れることがあることを知っています。多分誰かがそれを議論しているリンクを見つけることができますか?

于 2012-08-14T21:51:20.990 に答える