2012-02-16 9 views
14

मैं नहीं समझ सकता क्यों यहमैं टर्नरी ऑपरेटर के साथ दशमलव को शून्य क्यों नहीं दे सकता?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+2

हम दिमागी पाठक नहीं हैं, क्या काम नहीं करता है? –

+2

इसे सशर्त ऑपरेटर कहा जाता है, न कि टर्नरी ऑपरेटर –

+0

@ जकूबकोनेकी हालांकि यह स्पष्ट है। जितना संभव हो उतना जानकारी प्रदान करना हमेशा अच्छा होता है। इस मामले में एक संकलन त्रुटि –

उत्तर

34

करने के लिए इसे डाल सकता है और आप एक टाइप किया वस्तु निर्दिष्ट करने के लिए की जरूरत है।

यह काम करना चाहिए:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : (decimal?)null; 

या इस एक सा बेहतर है:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
     ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
     : default(decimal?); 

यहाँ default कीवर्ड के लिए MSDN कड़ी है।

+0

धन्यवाद बहुत slugster। –

+1

fanbloodytastic! – northpole

+3

सबसे अच्छी प्रतिक्रिया वह है जो सिर्फ जवाब नहीं देती बल्कि सूचित करती है और शिक्षित करती है .. अच्छा एक स्लगस्टर –

2

काम नहीं करेगा आप decimal?

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
    ? (decimal?)decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
    : null; 
+1

है जो कोई फर्क नहीं पड़ता। एक 'दशमलव' को 'दशमलव' में रखा जा सकता है। –

+0

"टर्नरी ऑपरेटर का आउटपुट प्रकार पहले भाग का प्रकार है": यह सच नहीं है ... यह पहले या दूसरे भाग का प्रकार हो सकता है, इस पर निर्भर करता है कि उनके बीच कौन से रूपांतरण मौजूद हैं –

+1

आप एक असाइन कर सकते हैं स्पष्ट कास्टिंग के बिना 'दशमलव' को 'दशमलव' तक। – slugster

3
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
          decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) : 
          (decimal?)null; 
5

के पहले भाग को कास्ट करने की जरूरत है इस प्रयास करें:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ? 
         decimal.Parse(txtLineCompRetAmt.Text.Replace(",", "")) : 
         (decimal?) null; 

समस्या यह है कि संकलक नहीं जानता कि null किस प्रकार है। तो आप बस क्योंकि null प्रकार object (प्रभावी रूप से untyped) की है decimal?

3

क्योंकि संकलक सशर्त ऑपरेटर के संचालन से सबसे अच्छा प्रकार का अनुमान नहीं लगा सकता है।

जब आप condition ? a : b लिखते हैं, वहाँ b के प्रकार के a के प्रकार से एक अंतर्निहित रूपांतरण या a के प्रकार के b के प्रकार के द्वारा की जानी चाहिए। संकलक तब संपूर्ण अभिव्यक्ति के प्रकार को इस रूपांतरण के लक्षित प्रकार के रूप में अनुमानित करेगा। तथ्य यह है कि आप इसे decimal? के चर के लिए असाइन करते हैं, जिसे कभी संकलक द्वारा नहीं माना जाता है। आपके मामले में, a और b के प्रकार decimal और कुछ अज्ञात संदर्भ या शून्य प्रकार हैं। संकलक अनुमान लगा सकते हैं नहीं तुम क्या मतलब है, ताकि आप इसे मदद की जरूरत है:

decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) 
          ? decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) 
          : default(decimal?); 
6

decimal.Parse प्रयोग न करें।

Convert.ToDecimal यदि यह शून्य स्ट्रिंग दिया जाता है तो 0 वापस आ जाएगा। decimal.Parse एक ArgumentNullException फेंक देगा यदि आप जिस स्ट्रिंग को पार्स करना चाहते हैं वह शून्य है।

संबंधित मुद्दे