2012-08-14 87 views
8

我有一個自定義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

Stepping through the code showing the value of amount3

Watch dialog and some more detail about state of variables

+0

CurrencyTextBox(TextBox的子類) – agrath 2012-08-14 21:09:51

+1

它是一個可爲空的十進制[decimal?] - 請參閱問題頂部的getter/setter定義 – agrath 2012-08-14 21:13:25

+1

您確定調試器將此信息正確地轉發給您嗎?你有沒有嘗試進一步下行,以確保你有'amount3'的更新值?因爲當'XXX'是一個可爲空的小數時,那麼'XXX? 0M'將是一個(不可爲空)的小數,如果它是非空的,它將具有「XXX」的值,否則值爲零。 – 2012-08-14 21:18:02

回答

0

(這個答案是從我的上述評論構造。)

確定調試dsiplays這個正確的你?你有沒有嘗試進一步下行,以確保你有更新的值amount3

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

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

1

在這個類似的問題,看看

using coalescing null operator on nullable types changes implicit type

爲什麼不只是做

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

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

+0

原來,這是一個調試問題。我非常擔心我的使用?有很多未知的副作用,我必須檢查我的所有項目,並確保我更改了語法 – agrath 2012-08-14 21:45:12

+0

另外,.Value是小數? (可空的) – agrath 2012-08-14 21:46:43

+0

哦,我沒有做這個連接,因爲它的一個可爲空的小數,實際值將是Value.Value :) – 2012-08-14 21:48:23