[英]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的一些屏幕抓片
看看這個類似的問題
在可空類型上使用coalescing null運算符更改隱式類型
為什么不做呢
decimal amount = uxTaxAmount.Value.HasValue ? uxTaxAmount.Value.Value : 0M
鑒於最近的編輯和評論,這不是原始海報問題的正確答案。
(這個答案來自我上面的評論。)
你確定調試器能正確地解決這個問題嗎? 你是否嘗試過進一步下行以確保你有更新的amount3
值?
我確定這只是調試器的一個問題。 有時你需要更進一步。 也許翻譯的代碼(IL)有一些優化混淆調試器(或我知道什么)。 但是沒有調試器,該值將在您預期時准確更新。
我見過其他有經驗的開發人員對類似的情況感到困惑,所以我知道在查看局部變量的賦值時,調試器有時候是“一行代碼”。 也許有人可以找到討論這個的鏈接?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.