我有一個自定義WebControl
它實現了一個.Value
的getter/setter返回可空<小數>瞭解空合併運算符(?)
這是一個客戶端過濾文本框(的TextBox
一個子類與包含的JavaScript和用於設置/獲取的值)
這裏一些服務器側邏輯是吸氣&從控制裝定:
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;
我看到的量被設定爲「0」時,uxAmount.Value
收益10000
這個工作如我所料(藉口在外殼的變化):
decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;
我也看到了這種行爲(最近)調用與空合併運算符一起在LINQ2SQL數據上下文定義的UDF功能時,這是我知道返回預期我的UDF調用價值,但我是ge改爲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
(解析出.Text
根據上述獲得者/設置者使用TryParse
是穩定的。我停在斷點處,沒有其他線程可以操縱這個值。
請注意,使用M後綴強制常數爲十進制,因爲它是整數,我懷疑是類型轉換的問題。
任何想法?
LHS和RHS的價值似乎是穩定的和已知的。
- 編輯一些screengrabs從VS2010
CurrencyTextBox(TextBox的子類) – agrath 2012-08-14 21:09:51
它是一個可爲空的十進制[decimal?] - 請參閱問題頂部的getter/setter定義 – agrath 2012-08-14 21:13:25
您確定調試器將此信息正確地轉發給您嗎?你有沒有嘗試進一步下行,以確保你有'amount3'的更新值?因爲當'XXX'是一個可爲空的小數時,那麼'XXX? 0M'將是一個(不可爲空)的小數,如果它是非空的,它將具有「XXX」的值,否則值爲零。 – 2012-08-14 21:18:02