आज मेरे साथ कुछ ऐसा हुआ जो मुझे मेरे सिर को खरोंच कर रहा है।Nullable <T> के मुक्केबाजी/अनबॉक्सिंग व्यवहार को कैसे संभव है?
Nullable<T>
के किसी भी प्रकार को null
पर असाइन किया जा सकता है। उदाहरण के लिए:
int? i = null;
पहले तो मुझे नहीं देख सकता था कि यह कैसे संभव होगा किसी भी तरह Nullable<T>
को object
से एक अंतर्निहित रूपांतरण को परिभाषित करने के बिना:
public static implicit operator Nullable<T>(object box);
लेकिन इसके बाद के संस्करण ऑपरेटर स्पष्ट रूप से मौजूद नहीं है, के रूप में अगर ऐसा किया तो निम्न भी कानूनी होने के लिए कम से कम संकलन समय पर (जो यह नहीं है) के लिए होता है:
int? i = new object();
तो मुझे लगता है कि पे महसूस किया rhaps Nullable<T>
प्रकार इस तरह, कुछ मनमाने ढंग से संदर्भ प्रकार है कि instantiated कभी नहीं किया जा सकता है के लिए एक अंतर्निहित रूपांतरण निर्धारित कर सकते हैं:
public abstract class DummyBox
{
private DummyBox()
{ }
}
public struct Nullable<T> where T : struct
{
public static implicit operator Nullable<T>(DummyBox box)
{
if (box == null)
{
return new Nullable<T>();
}
// This should never be possible, as a DummyBox cannot be instantiated.
throw new InvalidCastException();
}
}
बहरहाल, यह स्पष्ट नहीं होता कि आगे क्या घटित हुआ: अगर HasValue
संपत्ति किसी के लिए false
है , अगर HasValue
true
है,
int? i = new int?();
object x = i; // Now x is null.
इसके अलावा तो मूल्य: Nullable<T>
मूल्य है, तो उस मूल्य null
के रूप में बॉक्सिंग की जाएगी के रूप में बॉक्सिंग हो जाएगा एक T
बल्कि एक T?
से:
int? i = 5;
object x = i; // Now x is a boxed int, NOT a boxed Nullable<int>.
लेकिन इस मतलब के लिए एक कस्टम अंतर्निहित रूपांतरण Nullable<T>
से object
लिए है कि वहाँ लगता है:
public static implicit operator object(Nullable<T> value);
यह स्पष्ट रूप से मामला नहीं है object
सभी प्रकार के लिए एक बेस क्लास है, और आधार-प्रकार से उपयोगकर्ता परिभाषित अंतर्निहित रूपांतरण अवैध हैं (साथ ही वे होना चाहिए)।
ऐसा लगता है कि object x = i;
, i
किसी अन्य मान प्रकार की तरह बॉक्स ताकि x.GetType()
typeof(int?)
के समान ही परिणाम हैं (बजाय फेंक एक NullReferenceException
) चाहिए।
तो मैं थोड़ा और, यकीन है कि पर्याप्त चारों ओर खोदा, यह पता चला है इस व्यवहार Nullable<T>
प्रकार, विशेष रूप से दोनों में C# और VB.NET विनिर्देशों परिभाषित है, और किसी भी उपयोगकर्ता परिभाषित struct
(सी # में प्रतिलिपि प्रस्तुत करने योग्य नहीं के लिए विशिष्ट है) या Structure
(वीबीएनईटी)।
यहां मैं अभी भी उलझन में हूं।
यह विशेष मुक्केबाजी और अनबॉक्सिंग व्यवहार हाथ से लागू करना असंभव प्रतीत होता है। यह केवल काम करता है क्योंकि सी # और वीबी.नेट दोनों Nullable<T>
प्रकार के लिए विशेष उपचार देते हैं।
नहीं यह सैद्धांतिक रूप से संभव है कि एक अलग CLI आधारित भाषा मौजूद हो सकता है जहां
Nullable<T>
इस विशेष उपचार नहीं दिया गया? औरNullable<T>
प्रकार अलग-अलग भाषाओं में विभिन्न व्यवहार प्रदर्शित नहीं करेगा?सी # और वीबीएनईटी कैसे इस व्यवहार को प्राप्त करते हैं? क्या यह सीएलआर द्वारा समर्थित है? (यही है, CLR एक विशेष प्रकार के किसी भी तरह "ओवरराइड" जिस तरह से यह बॉक्सिंग है, भले ही C# और VB.NET खुद को यह निषेध अनुमति देता है?)
है तो यह और भी संभव (सी # में या वीबीएनईटी)
Nullable<T>
कोobject
के रूप में बॉक्स करने के लिए?
यह जेआईटी कंपाइलर है जो व्यवहार को लागू करता है। यहां और अधिक: http://stackoverflow.com/questions/1583050/performance-surprise-with-as-and-nullable-types/3076525#3076525 –
मुझे एहसास है कि मैं पार्टी के लिए 7 साल देर से हूं। लेकिन, मैं सुझाव देना चाहूंगा कि मेरे जैसे उत्सुक किसी भी अंतर्दृष्टि के लिए संदर्भ स्रोत भी पढ़ें। https://referencesource.microsoft.com/#mscorlib/system/nullable।सीएस, ffebe438fd9cbf0e – Licht