2010-01-08 11 views
13

क्या आपने कभी Convert.ChangeType() विधि का उपयोग Nullable<T> प्रकार में परिवर्तित करने के लिए किया है? अजीब बात यह है कि यह InvalidCastException फेंक देगा कि "शून्य ऑब्जेक्ट को किसी मान प्रकार में परिवर्तित नहीं किया जा सकता"।क्यों Nullable <T> एक मूल्य प्रकार माना जाता है?

अपने तत्काल खिड़की पर इस चलाने की कोशिश करें: ?System.Convert.ChangeType(null, typeof(int?))

कुछ अस्पष्ट कारण से, Nullables माना जाता है मूल्य प्रकार के। उदाहरण के लिए, typeof(int?).IsValueTypetrue देता है।

मेरे लिए, Nullable<T>null स्वीकार करते हैं, यह एक वर्ग प्रकार है, मूल्य प्रकार नहीं। क्या किसी को पता है कि यह अलग-अलग क्यों लागू होगा?

उत्तर

27

System.Nullable<T> तकनीकी रूप से एक संरचना है, इसलिए यह एक मान प्रकार है (एक Nullable<T> के लिए null मान को उसी एक अशक्त संदर्भ के रूप में एक ही बात नहीं है। यह एक बूलियन ध्वज कि एक मूल्य की कमी को दर्शाता है है।) हालांकि, यह माना जाता है विशेष रूप से रनटाइम द्वारा और यह इसे एक अजीब मूल्य प्रकार बनाता है। सबसे पहले, यह where T : struct प्रकार की बाधा को संतुष्ट नहीं करता है (यह where T : class को संतुष्ट नहीं करता है, इसके लिए यह क्या लायक है)। दूसरा, यह एक दिलचस्प मुक्केबाजी व्यवहार प्रदर्शित करता है। ,

  • एक null संदर्भ यदि मान null है: एक Nullable<T> मुक्केबाजी का परिणाम देगा।
  • अंतर्निहित प्रकार का एक बॉक्स किया गया मान वास्तव में एक मूल्य है। यही कारण है, बयान में:

    int? x = 2; 
    object y = x; 
    

    y एक बॉक्स्ड Nullable<int> नहीं है। यह बस एक बॉक्सिंग int है। आप T से Nullable<T> (और T) के किसी भी बॉक्स किए गए मान को अनबॉक्स कर सकते हैं। null का संदर्भ Nullable<T> के सन्दर्भ में null मान (जैसा कि आप उम्मीद कर सकते हैं) में परिणाम।

क्रम से यह विशेष उपचार नल प्रकार अधिक रास्ता संदर्भ प्रकार में null काम करता है के लिए इसी तरह काम करता है।

+3

अजीब मुक्केबाजी व्यवहार को समझने में कुछ समय लगता है - लेकिन मुझे खुशी है कि यह वही तरीका है; अन्यथा 'Nullable ' (जो मान पास पारदर्शिता से आता है) के मूल्य का अधिकतर खो जाएगा। – LBushkin

+1

असल में, मुक्केबाजी व्यवहार एक बदलाव था जो .NET 2.0 के विकास चक्र में देर से हुआ था। शुरुआती बीटा में, 'Nullable ' एक साधारण संरचना थी। अभ्यास में जब आप असल में मूल्यों को संग्रहीत करने के लिए वास्तव में उपयोग करने योग्य प्रकारों का उपयोग करते हैं, तो मुझे भी लगता है कि यह व्यवहार अधिक प्राकृतिक है। –

+0

रास्ते में बढ़िया जानकारी शामिल है – Nick

11

Nullable<T> एक मान प्रकार (यह एक struct है, MSDN documentation में देखें) है, लेकिन वहां एक अंतर्निहित एक मूल्य (x.HasValue == false) के बिना एक Nullable<T> को null से रूपांतरण है। के मानों के प्रकार T के मानों से एक अंतर्निहित रूपांतरण भी है।

इसके अतिरिक्त सभी ऑपरेटरों को नियमित प्रकार से हटाया जाता है ताकि सीधे नलिका प्रकारों के साथ काम किया जा सके।

+0

डाउनवोट क्यों? मैं गलत हूँ? यदि ऐसा है, तो कृपया मुझे प्रबुद्ध करें। –

+0

मैं डाउनवोट को रद्द करने के लिए अपवित्र हूं। :) –

2

Nullable<T> एक संरचना के रूप में लागू किया गया है और structs मूल्य प्रकार हैं।

+1

लेकिन कोई संरचना 'शून्य' मान प्राप्त नहीं कर सकती है। मेरा मानना ​​है कि नलटेबल्स structs से काफी अलग हैं जिन्हें structs नहीं माना जाता है। – jpbochi

+2

'Nullable 'को' शून्य 'मान प्राप्त नहीं हो सकता है, यह सिर्फ' शून्य 'से और उसके लिए एक अंतर्निहित रूपांतरण है। यदि आप चाहें तो आप इसे किसी भी कस्टम 'स्ट्रक्चर' पर लागू कर सकते हैं। – Aaronaught

+4

@Aaronaught: आप कस्टम स्ट्रक्चर के साथ कुछ * समान * कर सकते हैं, लेकिन कोड के माध्यम से शून्य प्रकारों के बहुत सारे व्यवहार को नकल नहीं किया जा सकता है। शून्य मूल्य केवल पुस्तकालय समाधान नहीं हैं। उन्हें कंपाइलर से विशेष समर्थन मिलता है (और सीएलआर भी, मुझे लगता है)। –

1

मैंने इस प्रश्न को "संबंधित प्रश्न" सूची में Why Nullable<T> is a struct? पर देखा और मुझे लगता है कि मेरा उत्तर यहां भी लागू होता है। Nullable<T> का पूरा बिंदु शून्य मान लेने की क्षमता को छोड़कर प्रत्येक संबंध में मूल्य प्रकार की तरह कार्य करना है।

एक शून्य संदर्भ के शून्य को दो तरीकों से देखा जा सकता है।एक यह है कि यह किसी भी संदर्भ का संदर्भ नहीं दे रहा है, दूसरा यह है कि इसका कोई सार्थक मूल्य नहीं है। ये चीजें एक ही बात कहने के दो अलग-अलग तरीके हैं, लेकिन उनके पास अलग-अलग उपयोग हैं।

Nullable<T> हमें यह कहने की क्षमता देता है कि "इसका कोई सार्थक मूल्य नहीं है" और उस हद तक यह एक समान संदर्भ के रूप में समान अर्थशास्त्र हो सकता है, लेकिन यह किसी अन्य तरीके से संदर्भ की तरह नहीं है। जब शून्य हो जाती है तो यह शून्य है कि "कोई सार्थक मूल्य" शून्य नहीं है - नहीं "कुछ भी संदर्भित नहीं करता है" और जब शून्य नहीं होता है तो यह मान रखता है, इसका जिक्र नहीं करता है।

(एरोर्नॉट का तर्क है कि इसका मतलब है कि एक नालीबल वास्तव में शून्य नहीं हो सकता है, जबकि मैं असहमत हूं क्योंकि जिस स्तर पर इसका उपयोग होता है, वह एक अर्थपूर्ण शून्य हो सकता है, उसका बिंदु उस पर विचार करने लायक है जब भी "शून्य" निरर्थक संदर्भ के लिए अलग है - वास्तव में हमारी असहमति यह है कि हम किस स्तर के अमूर्तता का उपयोग करना चुनते हैं)।

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