2011-03-23 18 views
13

मैं थोड़ा अस्पष्ट हूं कि Value शून्य प्रकारों पर संपत्ति का उपयोग किसी शून्य प्रकार में मौजूद मान प्राप्त करने के दौरान किया जाना चाहिए। निम्नलिखित उदाहरण पर विचार करें:सी # निरर्थक प्रकार और मूल्य संपत्ति

int? x = 10; 

Console.WriteLine("The value of 'x' is " + x.Value); 
Console.WriteLine("The value of 'x' is " + x); 

इनमें से दोनों एक ही मूल्य (10) लौटते हैं।

हालांकि, अगर मैंने शुरुआत में x से null पर सेट किया है, तो पहले Console.WriteLine अपवाद फेंकता है और दूसरा नहीं करता है।

तो, मेरा सवाल यह है। Value संपत्ति का उपयोग करने का क्या मतलब है? वास्तविक मूल्य प्राप्त करने के लिए इसकी आवश्यकता नहीं होती है (भले ही यह null है) और यदि मान वास्तव में null है तो अपवाद फेंक देगा।

उत्तर

20

यह आमतौर पर आवश्यक है - बस आपके विशेष मामले में नहीं। x का प्रकार Nullable<int> है, int नहीं - और Nullable<T> से T पर रूपांतरण नहीं है।

चलिए देखते हैं कि आपके उदाहरण में क्या हो रहा है।

Console.WriteLine(string.Concat("The value of 'x' is ", x)); 

कि मुक्केबाजी x है, जो या तो एक बॉक्सिंग intया एक अशक्त संदर्भ ... जो दोनों के string.Concat द्वारा नियंत्रित किया जाता है में परिणाम होगा: अपने अंतिम लाइन में बदला जा रहा है।

जब आप स्ट्रिंग concatenation के माध्यम से एक स्ट्रिंग में परिवर्तित, उदाहरण के लिए यदि आप चाहते थे:

int nonNullable = x.Value; 

तो आप Value संपत्ति का उपयोग करना होगा - GetValueOrDefault करने के लिए या एक स्पष्ट डाली, या संभवतः एक अशक्त कोलेसिंग ऑपरेटर, या एक फोन:

int nonNullable = (int) x; 
int alternative = x ?? 20; 
int andAnother = x.GetValueOrDefault(20); 
+1

या संभवतः x.GetValueOrDefault (20) की तरह मूल्य की जांच कर सकते हैं, हालांकि अशक्त कोलेसिंग स्पष्ट रूप से अच्छा है, नहीं पता था कि संभव हो गया था। – jishi

+0

@ जिशी: अच्छा विकल्प, मैं इसे वहां जोड़ दूंगा। –

5

x और x.Value के विभिन्न प्रकार हैं।

static void Meth(int i) 
    { 
     int? x = 5; 
     Meth(x); 
     Meth(x.Value); 
    } 

दूसरी पंक्ति संकलित नहीं होती है।

तो x.Value का उपयोग करने का कारण स्पष्ट है - आपको वास्तविक मूल्य की आवश्यकता होने पर इसे कॉल करने की आवश्यकता है। और NullReferenceException उचित है, क्योंकि null मूल्य प्रकार के मान के अनुरूप नहीं है।

+0

लेकिन आपके पास 'मेथ ((int) x हो सकता है;' और यह संकलित होगा। :) –

+2

@ छाया विज़ार्ड '(int) x'' x.Value' जैसा ही है – Andrey

0

यदि HasValue संपत्ति सत्य लौटती है तो आपको मूल्य संपत्ति का उपयोग करना चाहिए, अन्यथा आपको अपवाद मिलेगा। आपका उदाहरण काम करता है क्योंकि Nullable ने ToString() विधि को अधिभारित किया है और सी # कंपाइलर इस प्रकार के शॉर्टकट का समर्थन करता है।

0

जब x शून्य x.Value एक सिस्टम फेंक देगा।कोई अपवाद नहीं

0

आप एक नल पूर्णांक के लिए .Value उपयोग करना चाहते हैं: InvalidOperationException अपवाद

string + null = string (कोई बात नहीं क्या एक्स के प्रकार है)। आप इस

int? x = null; 
int valXX = x.HasValue ? x.Value : 0; 
Console.WriteLine("The value of 'x' is ->" + x + "<-"); 
Console.WriteLine("The value of 'valXX' is ->" + valXX + "<-"); 
संबंधित मुद्दे