簡體   English   中英

理解空合並運算符(??)

[英]Understanding the null coalescing operator (??)

我有一個自定義WebControl ,它實現了一個返回Nullable <decimal>的.Value getter / setter

它是一個客戶端過濾的文本框( TextBox的子類,包含javascript和一些用於設置/獲取值的服務器端邏輯)

這是來自該控件的getter和setter:

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.Value返回10000時,我看到Amount被設置為“0”。

這符合我的預期(原則是套管的變化):

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

我也看到了這種行為(最近)在調用Linq2Sql數據上下文中定義的UDF函數以及空合並運算符時,我知道我的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,但是uxAmount.Value的值(使用TryParse按照上面的getter / setter解析出來的.Text是穩定的。我在斷點處停止了,並且沒有其他線程可以可以操縱這個值。

注意使用M后綴將常量強制為十進制,因為它是整數,我懷疑是類型轉換問題。

有任何想法嗎?

LHS和RHS的值似乎都是穩定且已知的。

--edit--來自VS2010的一些屏幕抓片

單步執行顯示amount3值的代碼

觀察對話框以及有關變量狀態的更多詳細信息

看看這個類似的問題

在可空類型上使用coalescing null運算符更改隱式類型

為什么不做呢

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

鑒於最近的編輯和評論,這不是原始海報問題的正確答案。

(這個答案來自我上面的評論。)

你確定調試器能正確地解決這個問題嗎? 你是否嘗試過進一步下行以確保你有更新的amount3值?

我確定這只是調試器的一個問題。 有時你需要更進一步。 也許翻譯的代碼(IL)有一些優化混淆調試器(或我知道什么)。 但是沒有調試器,該值將在您預期時准確更新。

我見過其他有經驗的開發人員對類似的情況感到困惑,所以我知道在查看局部變量的賦值時,調試器有時候是“一行代碼”。 也許有人可以找到討論這個的鏈接?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM