2010-11-25 13 views
13

नीचे संकलित क्यों नहीं होगा? इंटरफ़ेस के बारे में विशेष क्या है जो संकलक को लगता है कि इसे Container<T> से T पर नहीं डाला जा सकता है, जब T एक इंटरफ़ेस है? मुझे लगता है कि यह एक संवादात्मक मुद्दा नहीं है, क्योंकि मैं निराशाजनक नहीं हूं, लेकिन शायद यह है। यह Why C# compiler doesn't call implicit cast operator? जैसा है लेकिन मुझे नहीं लगता कि यह काफी समान है।सी # सामान्य अंतर्निहित कास्ट

Product pIn =null; 
Product pOut; 
Container<Product> pContainer; 

List<Product> pListIn = null; 
List<Product> pListOut; 
Container<List<Product>> pListContainer; 

IList<Product> pIListIn = null; 
IList<Product> pIListOut; 
Container<IList<Product>> pIListContainer; 

pContainer = pIn; 
pOut = pContainer; // all good 

pListContainer = pListIn; 
pListOut = pListContainer; // all good too 

pIListContainer = pIListIn; // fails , cant do implicit cast for some reason 
pIListOut = pIListContainer; // and here too 

class Container<T> 
{ 
private T value; 

private Container(T item) { value = item; } 

public static implicit operator Container<T>(T item) 
{ 
    return new Container<T>(item); 
} 

public static implicit operator T(Container<T> container) 
{ 
    return container.value; 
} 
} 

Cannot implicitly convert type 'Container<IList<Product>>' to 'IList<Product>'. An explicit conversion exists (are you missing a cast?) 
Cannot implicitly convert type 'IList<Product>' to 'Container<IList<Product>>'. An explicit conversion exists (are you missing a cast?) 
+2

+1 - वास्तव में दिलचस्प। जवाब देखने के लिए उत्सुक है। – Lucero

+1

+1 - बस इस संकलन त्रुटि को मिला और यह पूछना चाहता था! – TDaver

उत्तर

13

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

सी # 4 कल्पना की धारा 10.3.3 से:

दिए गए स्रोत प्रकार S और लक्ष्य प्रकार टी के लिए, यदि एस या टी नल प्रकार, जाने हैं S0 और T0, उनकी अंतर्निहित प्रकार का उल्लेख अन्यथा एस 0 और टी 0 क्रमशः एस और टी के बराबर हैं। एक वर्ग या संरचना को किसी स्रोत प्रकार एस से एक लक्ष्य प्रकार टी में रूपांतरण घोषित करने की अनुमति है, यदि निम्न में से सभी सत्य हैं:

  • S0 और T0 विभिन्न प्रकार हैं।
  • या तो S0 या T0 कक्षा या संरचना प्रकार है जिसमें ऑपरेटर घोषणा होती है।
  • न तो S0 और न ही T0 एक इंटरफ़ेस-प्रकार है।
  • को छोड़कर उपयोगकर्ता परिभाषित रूपांतरण, एक रूपांतरण एस से टी करने के लिए या टी एस
  • बाद में करने के लिए

और फिर मौजूद नहीं है:

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

  • एक पूर्व निर्धारित निहित रूपांतरण (§6.1) टाइप करने के लिए टी, टी के एस से सभी उपयोगकर्ता-निर्धारित रूपांतरण (अस्पष्ट या स्पष्ट) प्रकार S से मौजूद है, तो ध्यान नहीं दिया जाता।
  • यदि पूर्व निर्धारित परिभाषित रूपांतरण (§6.2) टाइप एस से टाइप करने के लिए मौजूद है, तो टी से किसी भी उपयोगकर्ता द्वारा परिभाषित स्पष्ट रूपांतरण को अनदेखा किया जाता है। इसके अलावा:
    • यदि टी एक इंटरफ़ेस प्रकार है, तो एस से टी के उपयोगकर्ता द्वारा परिभाषित अंतर्निहित रूपांतरणों को अनदेखा किया जाता है।
    • अन्यथा, एस से टी के उपयोगकर्ता द्वारा परिभाषित अंतर्निहित रूपांतरण अभी भी माना जाता है।

नोट पहले नेस्टेड गोली यहाँ।

(मैं अच्छी तरह से माध्यम से कल्पना की पकड़ हो रही सलाह देते हैं। यह various versions and formats में ऑनलाइन उपलब्ध है, लेकिन hardcopy annotated edition भी टीम और दूसरों से थोड़ा डली की एक सोने की खान है। मैं एक निश्चित पूर्वाग्रह यहाँ कबूल करना चाहिए कर सकते हैं, के रूप में मैं annotators में से एक हूँ - लेकिन मेरा सामान अनदेखी, अन्य सभी एनोटेशन अच्छी तरह से पढ़ने लायक हैं)

+0

दिलचस्प दिलचस्प .... इंटरफ़ेस को लागू करने के प्रकार के बारे में आपका बिंदु अब पूरी समझ में आता है कि आपने इसे इंगित किया है। अपने अंक महासागर में एक और अच्छी तरह से योग्य ड्रॉप। मैं गहराई की किताब में अपनी नई प्रतीक्षा कर रहा हूं, इसलिए बीमार को पहले इसे प्राप्त करना होगा। ;) – jasper

+0

दूसरी तरफ, यदि एस ठीक ** ** इंटरफ़ेस टी को कार्यान्वित नहीं करता है (जो आईएमएचओ एक ठोस प्रकार से उपयोगकर्ता को परिभाषित रूपांतरण बनाने में एकमात्र लेकिन वास्तविक रूचि है), तो वहां होगा कुछ कास्ट को रोकने से बचा है? या यह सिर्फ इतना है कि सी # कंपाइलर टीम के पास इस भेद से निपटने की तुलना में तलना करने के लिए अन्य मछली थी? – Ssithra

+0

@ सिथ्रा: कल्पना करें कि एस ने नहीं किया है, लेकिन एस के कुछ * उप प्रकार * ने किया था ... और निष्पादन समय पर वास्तविक प्रकार उस उपप्रकार था ... क्या होना चाहिए? क्या उपयोगकर्ता द्वारा परिभाषित रूपांतरण लागू किया जाना चाहिए जब इसकी वास्तव में आवश्यकता नहीं है? किसी और चीज के अलावा, यह भ्रम के लिए एक नुस्खा की तरह लगता है। –

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