2010-09-15 15 views
7

"किसी भी वर्ग-प्रकार एस से किसी भी इंटरफ़ेस-प्रकार टी तक, प्रदान किया गया एस प्रदान नहीं किया गया है और प्रदान किया गया है एस एस लागू नहीं करता है।" वास्तव में मतलब है?"किसी भी वर्ग-प्रकार एस से किसी भी इंटरफ़ेस-प्रकार टी तक, क्या प्रदान किया जाता है एस को सील नहीं किया जाता है और प्रदान किया जाता है एस एस लागू नहीं करता है।" वास्तव में मतलब है?

मैं में सी # भाषा के विनिर्देशों here इस भर में आया था:

6.2.4 स्पष्ट संदर्भ रूपांतरण

स्पष्ट संदर्भ रूपांतरण हैं:

  • ...
  • किसी भी वर्ग-प्रकार एस से किसी भी इंटरफ़ेस-प्रकार टी, प्रो मिली एस सील और एस टी
को लागू नहीं है प्रदान नहीं की है

मैं समझता हूँ "बशर्ते एस बंद है नहीं" क्या मतलब है, लेकिन मुझे यकीन है कि अगर मैं समझता हूँ कि क्या "प्रदान की एस करता है नहीं कर रहा हूँ टी लागू नहीं "वास्तव में मतलब है।

उदाहरण के लिए:

class S {}//not sealed, nor does it implement T 
interface T {} 
... 
T t = (T)new S();//will throw InvalidCastException. 

यह है कि यह चश्मा में है केवल एक स्पष्ट संदर्भ रूपांतरण, को व्यक्त करने का सभी वाक्य रचना सही तरीके की गणना करने के लिए कि क्या यह एक अपवाद फेंक देते हैं या नहीं हो सकता है? या क्या इसका मतलब कुछ और चीज है जिसे मैं नहीं जानता (अभी तक)?

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

+0

नोट: आपके उदाहरण में स्पष्ट रूपांतरण मौजूद था। अन्यथा यह संकलित नहीं होता। संकलन समय पर सब अच्छा है। तथ्य यह है कि रूपांतरण रन-टाइम पर उड़ाता है वह कुछ है जो * स्पष्ट * रूपांतरणों के लिए विशिष्ट है। कभी-कभी वे फेंकते हैं, कभी-कभी वे सफल होते हैं। अब, इसके विपरीत, यदि 'एस'' टी' लागू करता है, तो *** *** अंतर्निहित *** संदर्भ रूपांतरण होता है (उस पर अन्य उपखंड देखें)। इसलिए वे कहते हैं कि 'एस' 'टी' लागू नहीं करता है, अन्यथा पहले से ही एक और (बेहतर) रूपांतरण उपलब्ध होगा। –

उत्तर

6

यमक "सील नहीं" भाग में है:

class S {} //not sealed, nor does it implement T 
interface T {} 

class S2 : S, T { } 

    S s = new S2(); // S reference to an S2 instance, implicit conversion 
    T t = (T)s;  // OK, s refers to an S2 instance that does implement T 

यह हो सकता है कि यह चश्मा में है केवल एक स्पष्ट संदर्भ रूपांतरण को व्यक्त करने का सभी वाक्य रचना सही तरीके की गणना करने में, ...

हां, संकलक को तब तक अनुमति देनी चाहिए जब तक कि यह रूपांतरण असंभव न हो।

यदि आप T t = (T)s; देखते हैं, यदि एस को सील कर दिया गया था तो संकलक निश्चित रूप से जान सकता था कि रूपांतरण असंभव था।लेकिन एक असीमित S के साथ, यह संभावना को खत्म करना होगा कि sS2 प्रकार का संदर्भ दे रहा है, और यह व्यावहारिक/संभव नहीं है (एस 2 किसी अन्य असेंबली में हो सकता है)।

+0

_ लॉल, मुहरबंद भाग ने वास्तव में बताया कि विरासत ** ** शामिल है। तुरंत यह नहीं देखा;)। स्पष्ट पढ़ने पर महान सबक! –

+0

धन्यवाद! संदेह है कि मैं इसे अपने आप प्राप्त कर पाऊंगा। – blizpasta

0

क्या आप वाकई टेक्स्ट में कोई त्रुटि नहीं हैं?

एस परंतु को लागू करता है टी

संपादित करें: मैं संदर्भ मिल गया है: http://msdn.microsoft.com/en-us/library/aa691291(v=VS.71).aspx

स्पष्ट संदर्भ रूपांतरण है यही कारण है, इसका मतलब है कि निहित नहीं है! तो वाक्य "किसी भी वर्ग-प्रकार से किसी भी इंटरफ़ेस-टाइप टी तक, बशर्ते एस को सील नहीं किया गया है और बशर्ते एस टी लागू नहीं करता है" सही है, यह एक निहित रूपांतरण नहीं हो सकता है, इसलिए यह स्पष्ट होना चाहिए (और यह स्पष्ट नहीं होना चाहिए गारंटी है कि यह सफल होगा)।

+0

मैंने सोचा कि यह एक त्रुटि हो सकती है। हालांकि यह मामला हो सकता है कि मैं बस यह नहीं जानता कि इसे सही तरीके से कैसे समझना है, "यह आपके कोड में सबसे अधिक संभावना है और संकलक में नहीं है।" – blizpasta

-1

ऐसा लगता है कि यह उपयोगकर्ता द्वारा परिभाषित रूपांतरणों के बारे में है।

आप निश्चित रूप से टी इंटरफेस करने अगर एस टी

+0

उपयोगकर्ता परिभाषित रूपांतरण यहां अप्रासंगिक हैं। सिर्फ इसलिए कि आपके पास किसी ऑब्जेक्ट का संदर्भ है जो एस के रूप में कार्य करता है, इसका मतलब यह नहीं है कि यह वास्तव में एक एस है और ऐसा कुछ नहीं है जो एस के सुपरसेट है। सुपरसैट मानक रूपांतरण नियमों के साथ परिवर्तनीय हो सकता है। –

0

कल्पना कहने के लिए चला जाता है को लागू नहीं करता वर्ग एस कास्ट नहीं कर सकते हैं:

स्पष्ट संदर्भ रूपांतरण संदर्भ-प्रकार के बीच उन रूपांतरणों हैं कि यह सुनिश्चित करने के लिए कि वे सही हैं, रन-टाइम चेक की आवश्यकता है।

दूसरे शब्दों में, यहां सूचीबद्ध रूपांतरण के प्रकार उन स्पष्ट रूपांतरण हैं, जहां कंपाइलर जांच नहीं कर सकता है यदि ऐसा रूपांतरण संभव है और संकलन समय पर मान्य है, तो दो प्रकार के बीच स्पष्ट संबंधों की कमी के कारण । इस तरह के रूपांतरण प्रयास को प्रोग्राम के निष्पादन के दौरान हल किया जाएगा और यदि रूपांतरण असंभव है, तो इसका अपवाद हो सकता है।

रन-टाइम स्पष्ट रूपांतरण का कैननिकल उदाहरण विफल हो सकता है, लेकिन यह भी सफल हो सकता है, इंटरफ़ेस-प्रकार एस से इंटरफ़ेस-प्रकार टी में रूपांतरण होगा, जहां एस और टी संबंधित नहीं हैं। सफलता इस बात पर निर्भर करती है कि अंतर्निहित वस्तु दोनों इंटरफेस लागू करती है या नहीं।

क्लास-टाइप एस से इंटरफ़ेस-प्रकार टी तक के मामले के विशेष उत्सुक उदाहरण, जहां एस टी (और मुहरबंद नहीं है) लागू नहीं करता है, तब होगा जब एस COM ऑब्जेक्ट होता है, और टी है कोकलास द्वारा लागू किए गए प्रकार के पुस्तकालय में एक COM इंटरफ़ेस स्पष्ट रूप से सूचीबद्ध नहीं है। इस मामले में, रूपांतरण विफल हो सकता है, लेकिन यह भी सफल हो सकता है, जो कि विशेष IU अज्ञात :: कोक्लास के क्वेरी इंटरफेस कार्यान्वयन के आधार पर सफल हो सकता है। (ध्यान दें कि तकनीकी रूप से, इस मामले में कॉकलास इंटरफेस को कार्यान्वित कर रहा है, लेकिन यह कंपाइलर को विज्ञापन नहीं दे रहा है)

और निश्चित रूप से, @ हेनक होल्टरमैन एस 2: एस, टी का उदाहरण भी एक अच्छा उदाहरण है जहां वह रूपांतरण सफल हो सकता है

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

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