2015-06-22 9 views
18

किसी को क्यों इस इकाई परीक्षण दृश्य स्टूडियो 2013 में विफल हो रहा है पर किसी भी प्रकाश डाला सकता है?क्या सी # कंपाइलर अनुकूलनीय प्रकारों को अनुकूलित कर रहा है?

[TestMethod] 
public void Inconceivable() 
{ 
    int? x = 0; 
    Assert.AreEqual(typeof(int?), x.GetType()); 
} 
+0

Assert.IsInstanceOfType (? एक्स, typeof (int)); –

+0

आप क्यों कुछ है कि स्थिर संकलक द्वारा निर्धारित किया जाता है का दावा करने की कोशिश कर रहे हैं? 'x' * * 'int' के अलावा कुछ भी नहीं हो सकता है या प्रोग्राम संकलित नहीं होगा। – Servy

+2

@ सर्वी - मेरा मुद्दा यह था कि यूनिट परीक्षण विफल होने पर विफल रहता है। Discosultan क्यों समझाया एक उत्कृष्ट काम किया। मैं दार्शनिकों को यह बहस करने के लिए छोड़ देता हूं कि गेटटाइप को जिस तरह से व्यवहार करना चाहिए या नहीं करना चाहिए। –

उत्तर

27

आपका परीक्षण विफल हो रहा है क्योंकि:

एक Nullable प्रकार पर GetType कॉलिंग का कारण बनता है जब प्रकार परोक्ष Object में बदल जाती है एक बॉक्सिंग कार्रवाई किया जाना है। इसलिए GetType हमेशा एक प्रकार उद्देश्य यह है कि अंतर्निहित प्रकार, नहीं Nullable प्रकार का प्रतिनिधित्व करता है देता है।

आप How to: Identify a Nullable Type से अधिक पढ़ सकते हैं।

कुछ उदाहरण पिछले लेख से लिया:

int? i = 5; 
Type t = i.GetType(); 
Console.WriteLine(t.FullName); //"System.Int32" 

भी ध्यान रखें कि:

सी # is ऑपरेटर भी एक Nullable की अंतर्निहित प्रकार पर चल रही है। इसलिए आप उपयोग नहीं कर सकते है निर्धारित करने के लिए एक चर एक Nullable प्रकार है या नहीं। निम्न उदाहरण से पता चलता है कि ऑपरेटर एक पूर्णांक के रूप में एक Nullable < पूर्णांक > चर व्यवहार करता है।

int? i = 5; 
if (i is int) { ... } // true 

आप यह मानते हुए कि सी # संकलक नल प्रकार के अनुकूलन में सही हैं।

यह केवल सम्मान मुक्केबाजी को और unboxing कि CLR किसी विशेष नल प्रकार के बारे में व्यवहार के साथ है: यहाँ जॉन स्कीट के C# in Depth से एक उद्धरण जो आपके प्रश्न का उत्तर चाहिए। वास्तव में, समुदाय अनुरोधों के परिणामस्वरूप, .NET 2.0 के रिलीज से कुछ ही समय पहले ही व्यवहार बदल दिया गया था।

Nullable का एक उदाहरण या तो एक अशक्त संदर्भ के लिए बॉक्सिंग है या टी की एक बॉक्स्ड मूल्य (अगर यह होता है) (अगर यह एक मूल्य नहीं है)। यह कभी भी "बॉक्स किए गए नाली योग्य int" के लिए बक्से नहीं है - ऐसा कोई प्रकार नहीं है।


StackOverflow पर एक समान धागा नहीं है: Nullable type is not a nullable type?

+0

यह एक अर्थपूर्ण विघटन है, अगर मैं ' मैंने कभी देखा है! –

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