2012-01-17 27 views
6

सी # में शून्य coalescing ऑपरेटर (??) के बारे में निम्नलिखित समझ के साथ।नल-कोलेसेसिंग ऑपरेटर का प्रभावशाली कास्टिंग परिणाम

int? input = -10; 
int result = input ?? 10;//Case - I 
//is same as: 
int result = input == null? input : 10; // Case - II 

है, परिभाषा और उपयोग द्वारा, केस मैं और केस II एक ही हैं।

यह देखकर आश्चर्य की बात है कि केस-आई कंपाइलर में अंतर्निहित रूप से int डालने में सक्षम है? केस-द्वितीय में int int करने के लिए यह त्रुटि दिखाता है: 'त्रुटि 1 अंतर्निहित रूप से प्रकार' int 'को परिवर्तित नहीं कर सकता? 'Int' "

को यह क्या है कि मैं अशक्त-कोलेसिंग ऑपरेटर के बारे में याद आ रही है?

आपकी रुचि के लिए धन्यवाद।

उत्तर

5

त्रिगुट ऑपरेटर के साथ दूसरे मामले काम करने के लिए, आप इस्तेमाल कर सकते हैं निम्नलिखित:।

int result = input != null ? input.Value : 10; 

Nullable<T> प्रकार के Value संपत्ति रिटर्न T मूल्य (इस मामले में, int)

एक अन्य विकल्प Nullable<T>.HasValue उपयोग करने के लिए है:

int result = input.HasValue ? input.Value : 10; 

myNullableInt != null निर्माण ऊपर HasValue कॉल के लिए केवल वाक्यात्मक चीनी है।

+0

पहला परीक्षण का उपयोग करना चाहिए '=' बल्कि '==' से – hvd

+0

@hvd: बिल्कुल सही, मैं एक बुरा उदाहरण होने के लिए ओ पी दोषी ठहराते हैं। : -पी संपादित। –

+0

दरअसल, मुझे लगता है कि आपका जवाब थोड़ा दूर है ... 'ए? बी: सी', जहां 'बी'' int 'है और 'c'' int' है, पूरी तरह मान्य है। हालांकि, परिणाम 'int?' टाइप किया गया है, इसलिए आपको '(ए? बी: सी)। वैल्यू 'की आवश्यकता होगी। या आपके सुझाए गए सुधार, जो स्पॉट पर है। – hvd

5

यह व्यवहार आप अशक्त-कोलेसिंग ऑपरेटर ?? के लिए देखा है एक प्रलेखित भाषा सुविधा है, अधिक जानकारी के लिए सी # 4.0 भाषा विशिष्टता की धारा 7.13 देखते हैं।

The type of the expression a ?? b depends on which implicit conversions are available on the operands. In order of preference, the type of a ?? b is A0, A, or B, where A is the type of a (provided that a has a type), B is the type of b (provided that b has a type), and A0 is the underlying type of A if A is a nullable type, or A otherwise. Specifically, a ?? b is processed as follows:

  • If A exists and is not a nullable type or a reference type, a compile-time error occurs.

  • If b is a dynamic expression, the result type is dynamic. At run-time, a is first evaluated. If a is not null, a is converted to dynamic, and this becomes the result. Otherwise, b is evaluated, and this becomes the result.

  • Otherwise, if A exists and is a nullable type and an implicit conversion exists from b to A0, the result type is A0. At run-time, a is first evaluated. If a is not null, a is unwrapped to type A0, and this becomes the result. Otherwise, b is evaluated and converted to type A0, and this becomes the result.

  • Otherwise, if A exists and an implicit conversion exists from b to A, the result type is A. At run-time, a is first evaluated. If a is not null, a becomes the result. Otherwise, b is evaluated and converted to type A, and this becomes the result.

  • Otherwise, if b has a type B and an implicit conversion exists from a to B, the result type is B. At run-time, a is first evaluated. If a is not null, a is unwrapped to type A0 (if A exists and is nullable) and converted to type B, and this becomes the result. Otherwise, b is evaluated and becomes the result.

  • Otherwise, a and b are incompatible, and a compile-time error occurs.

देखें क्यों सशर्त ऑपरेटर अलग काम करती है a ? b : c के लिए खंड 7.14।

Download the specification दोनों अपने अवकाश में पूर्णता में पढ़ने के लिए।

int result = input != null ? input : 10; 

अब इस वजह त्रिगुट ऑपरेटर के साथ उपयोग में दोनों प्रकार के बिल्कुल समान होना चाहिए संकलन नहीं होगा (: आप शायद मतलब -

0
int result = input == null ? input : 10; 

आप अपनी हालत के दूसरे मामले में मिश्रित मिल गया और int?int के रूप में ही) नहीं है - आप एक समाधान के रूप में एक सरल कलाकारों का उपयोग कर सकते हैं:

int result = input != null ? (int)input : 10; 
-1

एक अधिक संक्षिप्त explantion:

int? NULL_Int = 1; 
int NORM_Int = 2; 

NULL_Int = NORM_Int; // OK 

NORM_Int = NULL_Int; // NO, you can't assign a null to an int