2013-01-31 17 views
6

निम्नलिखित कोड को देखते हुएएक साथ काम नहीं कर सकते हैं, तो इनलाइन के साथ शून्य प्रकार?</p> <pre><code>Dim widthStr As String = Nothing </code></pre> <p>यह काम करता है - <code>width</code> असाइन किया गया है <code>Nothing</code>:

Dim width As Nullable(Of Double) 
If widthStr Is Nothing Then 
    width = Nothing 
Else 
    width = CDbl(widthStr) 
End If 

लेकिन यह नहीं है - width हो जाता है 0.0 (हालांकि यह तार्किक समान कोड हो रहा है):

Dim width As Nullable(Of Double) = If(widthStr Is Nothing, Nothing, CDbl(widthStr)) 

क्यों? क्या यह काम करने के लिए मैं कुछ कर सकता हूं?

+0

क्या आपने सी # में ऐसा करने की कोशिश की? 'दोगुना? चौड़ाई = widthStr! = शून्य? डबल। पर्स (चौड़ाई एसआरटी): (डबल?) शून्य; ' –

+0

कृपया http://stackoverflow.com/questions/14633824/nullable-type-with-inline-if-cannot-work- साथ में http: // stackoverflow देखें। कॉम/प्रश्न/2647558 ​​/ संरक्षित-शून्य-मान-इन-ए-डबल-वेरिएबल – spajce

+2

@ हाईकोर - सी # में 'शून्य 'और वीबी.Net में' कुछ भी नहीं '* समकक्ष नहीं है। 'कुछ भी नहीं' लगभग, 'डिफ़ॉल्ट (टी) 'है। –

उत्तर

4

यह सभी अभिव्यक्तियों के विश्लेषण को टाइप करने के लिए नीचे आता है।

Nothing वीबी.Net में एक जादुई जानवर है। यह सी # में लगभग default(T) जैसा ही है।

जैसे, जब निम्न के लिए सबसे अच्छा प्रकार का निर्धारण करने की कोशिश कर:

If(widthStr Is Nothing, Nothing, CDbl(widthStr)) 

तीसरा तर्क प्रकार Double की है। दूसरा तर्क परिवर्तनीय है Double (क्योंकि Nothing मूल्य प्रकारों का डिफ़ॉल्ट मान वापस कर सकता है)। इस प्रकार, If के वापसी मूल्य का प्रकार Double होने के लिए निर्धारित है।

के बाद टाइप प्रकार विश्लेषण का एक टुकड़ा निष्कर्ष निकाला गया है कि इस अभिव्यक्ति को आवंटित किया जा रहा है। और Double किसी भी चेतावनी के बिना Double? पर असाइन करने योग्य है।


कोई स्वच्छ आप कैसे उम्मीद अपने If() अभिव्यक्ति काम करने के लिए जिस तरह से नहीं है। क्योंकि VB.Net में null के बराबर नहीं है। Double के बजाय Double? देखने के लिए टाइप विश्लेषण को बल देने के लिए If के संभावित परिणामों में से एक को DirectCast (या समकक्ष) डालने के लिए आपको कम से कम DirectCast (या समतुल्य) की आवश्यकता होगी।

+0

+1, भले ही मुझे नहीं लगता कि मैं आपके उत्तर को पूरी तरह से समझता हूं। क्या आप सुझाव दे रहे हैं कि ऐसी इनलाइन 'अगर' हुड के तहत एक सामान्य कार्य है? और इस तरह वीएस इसके लिए निषिद्ध प्रकारों के लिए काम करता है? – Neolisk

+0

@Neolisk - मैंने पहले पोस्ट किए जाने के बाद से कुछ बार अपने प्रश्न को संपादित किया है - क्या आपने हालिया संस्करण पढ़ा है? 'अगर' एक सामान्य कार्य नहीं है। लेकिन जैसा कि मैंने कहा है, 'कुछ भी नहीं', एक जादुई जानवर है। यह टाइपलेस (स्वयं में और स्वयं) है और इसलिए किसी अन्य प्रकार की जानकारी का पहले उपयोग किया जाता है। –

+0

दिलचस्प, हालांकि मैं समीकरण के बाईं तरफ के प्रकार पर विचार करने के लिए प्रकार विश्लेषण की अपेक्षा करता हूं। वैसे भी, इस तरह के एक पूर्ण स्पष्टीकरण के लिए धन्यवाद। – Neolisk

10
डेमियन के जवाब देने के लिए

इसके अलावा, यह करने के लिए स्वच्छ रास्ता नहीं उपयोग Nothing है, लेकिन इसके बजाय New Double?:

Dim width As Double? = If(widthStr Is Nothing, New Double?, CDbl(widthStr)) 

और अब कि If अभिव्यक्ति के प्रकार के सही है, तो यह कम किया जा सकता प्रति:

Dim width = If(widthStr Is Nothing, New Double?, CDbl(widthStr)) 
+0

+1। एक सुझाव के लिए धन्यवाद। मैं आम तौर पर कोड स्पष्टता के लिए किसी भी विशेष पात्रों का उपयोग नहीं करना पसंद करता हूं। तो 'मंद चौड़ाई के रूप में शून्य (डबल) = यदि (चौड़ाई एसआरटी कुछ भी नहीं है, नया नलबल (डबल का), सीडीबीएल (चौड़ाई एसआरटी))' अधिक बेहतर है। – Neolisk

+0

मैं आपकी विशेषताओं को "विशेष पात्रों" का उपयोग नहीं करने के लिए समझता हूं (मैं चर के लिए किसी भी प्रकार के वर्णों का उपयोग नहीं करता - लेकिन मैं स्थिरांक के लिए करूंगा।) लेकिन इस मामले में आईडीई 'शून्य' के लिए '?' फॉर्म का जिक्र करते हुए त्रुटियों को फेंकता है (के) '। –

+0

क्या आपका मतलब है कि मेरा कोड काम नहीं करेगा? यह मेरे लिए काम करता है। – Neolisk

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