2012-08-14 25 views
8

मैं एक कस्टम WebControl जो एक .Value गेटर/एक Nullable < दशमलव >समझना अशक्त कोलेसिंग ऑपरेटर (??)

यह एक क्लाइंट-साइड फ़िल्टर किए गए पाठ बॉक्स है (TextBox का एक उपवर्ग लौटने सेटर को लागू करता है शामिल साथ है जावास्क्रिप्ट और

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 डेटा संदर्भ पर परिभाषित बुला, कि मुझे पता था कि मेरी यूडीएफ कॉल की उम्मीद दिया जाता है मूल्य लेकिन मैं जीई था इसके बजाय आरएचएस मूल्य tting।

आगे भ्रमित करते हुए, अगर मैं uxAmount का मूल्यांकन करता हूं। घड़ी में वैल्यू, मुझे 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 का मान (जिसेसे बाहर निकाल दिया गया है 1TryParse का उपयोग कर ऊपर गेटर/सेटर के अनुसार 10 स्थिर है। मैं ब्रेकपॉइंट पर रुक गया हूं और कोई अन्य थ्रेड नहीं है जो इस मान में हेरफेर कर सकता है।

एम प्रत्यय के उपयोग को निरंतर दशमलव के रूप में स्थिर करने के लिए नोट करें क्योंकि यह पूर्णांक था और मुझे एक प्रकार का रूपांतरण समस्या संदेह था।

कोई विचार?

एलएचएस और आरएचएस दोनों का मूल्य स्थिर और ज्ञात प्रतीत होता है।

VS2010

Stepping through the code showing the value of amount3

Watch dialog and some more detail about state of variables

+0

मुद्रा टेक्स्टबॉक्स (टेक्स्टबॉक्स का उप-वर्ग) – agrath

+1

यह एक शून्य शून्य है [दशमलव?] - – agrath

+1

प्रश्न के शीर्ष पर गेटर/सेटर परिभाषा देखें क्या आप सुनिश्चित हैं कि डीबगर आपको यह सही तरीके से प्रदर्शित करता है? क्या आपने यह सुनिश्चित करने के लिए कुछ पंक्तियों को आगे बढ़ाने की कोशिश की है कि आपके पास 'राशि 3' का अद्यतन मूल्य है? क्योंकि जब 'XXX' एक शून्य शून्य है, तो' XXX ?? 0 एम' एक (गैर-शून्य) दशमलव होगा जिसमें 'XXX' का मान होगा यदि यह शून्य न हो, और अन्यथा शून्य शून्य हो। –

उत्तर

0

(इस उत्तर मेरी टिप्पणी से ऊपर निर्माण किया गया था।)

आप डिबगर dsiplays यह सही हैं? क्या आपने यह सुनिश्चित करने के लिए कुछ पंक्तियों को आगे बढ़ाने की कोशिश की है कि आपके पास amount3 का अद्यतन मूल्य है?

मुझे यकीन है कि यह डीबगर के साथ सिर्फ एक मुद्दा है। कभी-कभी आपको थोड़ा और कदम उठाना पड़ता है। शायद अनुवादित कोड (आईएल) में कुछ अनुकूलन हैं जो डीबगर को भ्रमित करते हैं (या मुझे क्या पता चलेगा)। लेकिन डीबगर के बिना, जब आप इसकी अपेक्षा करते हैं तो मूल्य ठीक से अपडेट किया जाएगा।

मैंने अन्य अनुभवी डेवलपर्स को इसी तरह की स्थितियों से उलझन में देखा है, इसलिए मुझे पता है कि कभी-कभी स्थानीय चर के लिए असाइनमेंट को देखते समय डीबगर कभी "कोड की एक पंक्ति" है। हो सकता है कि कोई उस पर चर्चा करने वाला लिंक ढूंढ सके?

1

से समान प्रश्न पर एक नजर डालें कुछ screengrabs --edit--

using coalescing null operator on nullable types changes implicit type

क्यों न सिर्फ

करना
decimal amount = uxTaxAmount.Value.HasValue ? uxTaxAmount.Value.Value : 0M 

यह हालिया संपादन और टिप्पणियों के मूल पोस्टर समस्याओं का सही उत्तर नहीं है।

+0

बाहर निकलता है, यह एक डीबगर समस्या है।मैं बहुत चिंतित था कि मेरा उपयोग ?? बहुत सारे अज्ञात साइड इफेक्ट्स थे और मुझे अपनी सभी परियोजनाओं पर जाना होगा और सुनिश्चित करना होगा कि मैंने सिंटैक्स – agrath

+0

भी बदल दिया है। वैल्यू दशमलव है? (Nullable ) – agrath

+0

ओह मैंने उस कनेक्शन को नहीं बनाया है, क्योंकि यह एक शून्य शून्य है, वास्तविक मान वैल्यू होगा। वैल्यू :) –