2010-04-07 12 views
10

सभी को नमस्कार। मुझे खेद है, अगर यह पहले से ही पूछा गया था (व्यर्थ में खोजा गया) या वास्तव में बहुत आसान है, लेकिन मैं इसे प्राप्त नहीं कर सकता। एक Nullable प्रकार के MSDN definition, राज्यों, कि यह एक निम्नलिखित तरीके से परिभाषित किया गया है:नलबल <T> बाधाओं के बारे में भ्रम

[SerializableAttribute] 
public struct Nullable<T> 
where T : struct, new() 

तो सवाल यह काफी स्पष्ट है: इस परिभाषा कैसे संभव है? या यह सिर्फ एक टाइपो है? प्रत्येक मान प्रकार में पहले से ही एक डिफ़ॉल्ट कन्स्ट्रक्टर है। दरअसल, जब मैं इस तरह कुछ संकलित करने की कोशिश करता हूं, तो संकलक उचित रूप से कहता है कि एक ही समय में दोनों बाधाओं को लागू करना अवैध है, क्योंकि दूसरा व्यक्ति पूरी तरह से पहले में शामिल है।

अग्रिम धन्यवाद।

उत्तर

12

मुझे लगता है कि यह दस्तावेज़ीकरण में सिर्फ एक गलती है। यदि आप Nullable<T> को परावर्तक में टाइप करते हैं या वीएस में "जाने के लिए परिभाषा" कमांड का उपयोग करते हैं, तो यह केवल struct बाधा दिखाता है।


संपादित

मैंने इस बारे में फिर से सोच रहा था, और मैं एक छोटे से परीक्षण किया:

var attributes = typeof(Nullable<>).GetGenericArguments()[0].GenericParameterAttributes; 
Console.WriteLine(attributes); 

इस कोड को निम्नलिखित उत्पादन का उत्पादन:

NotNullableValueTypeConstraint, DefaultConstructorConstraint

तो प्रतिबिंब के अनुसार, TNullable<T> में करताnew() बाधा है ... इसका मतलब है कि भले ही यह सी # में अमान्य है, यह CLR के लिए मान्य होना चाहिए।

तो प्रलेखन दोनों सही और गलत है: यह सच है कि Nullable<T> में T "डिफ़ॉल्ट निर्माता" बाधा है, लेकिन सी # घोषणा यह पता चलता है गलत है ...

यह वास्तव में बहुत आश्चर्य की बात नहीं है, चूंकि दस्तावेज़ असेंबली मेटाडेटा (और निश्चित रूप से एक्सएमएल टिप्पणियों) से उत्पन्न होता है। वहाँ प्रलेखन जनरेटर में एक बग होना चाहिए ...

3

आप आईएल disassembly को देखें, तो आप देख सकते हैं कि यह एक निर्माता बाधा है कि:

.class public sequential ansi serializable sealed beforefieldinit Nullable<valuetype (System.ValueType) .ctor T> 

प्रलेखन से सीधे उत्पन्न होता है असेंबली मेटाडाटा, शायद यही कारण है?

5

सी # आवश्यक है कि मूल्य प्रकारों में डिफ़ॉल्ट सार्वजनिक निर्माता हों, लेकिन सीएलआर नहीं है।

यदि आपने ऐसी भाषा में एक प्रकार परिभाषित किया है जो इस प्रकार की संरचना परिभाषा का समर्थन करता है (मुझे विश्वास है कि सी ++/सीएलआई इसकी अनुमति देता है) वहां कहने पर अस्पष्टता होगी।

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