2012-07-31 14 views
5

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

public class MyString 
{ 
private string _string; 

public string String 
{ 
    get { return _string; } 
    set { _string = value; } 
} 

public MyString(string s) 
{ 
    _string = s; 
} 

public static implicit operator string(MyString str) 
{ 
    return str.String; 
} 

public static implicit operator MyString(string str) 
{ 
    return new MyString(str); 
} 
} 

मैं कैसे निम्नलिखित कोड काम कर सकता हूँ?

InvalidCastException: प्रकार 'MyString' की वस्तु कास्ट करने के लिए 'System.String' टाइप करने में असमर्थ

MyString a = "test"; 
object b = a; 
var c = (string)b; 

अब मैं इस अपवाद मिलता है।

+0

किस बारे में वर ग इसे छोड़ विरासत श्रृंखला को कभी नहीं छोड़ेंगे = b.ToString()? –

उत्तर

2

एक कस्टम डाली भेष में एक समारोह है। चाहे एक वास्तविक कास्ट किया जाता है या एक कस्टम रूपांतरण ऑपरेटर कहलाता है, अभिव्यक्ति के संकलित समय प्रकार पर निर्भर करता है।

आपके उदाहरण में अभिव्यक्ति का संकलन समय प्रकार कास्ट Ie डाला जा रहा है। अभिव्यक्ति का प्रकार bobject प्रकार object में स्ट्रिंग के लिए कस्टम रूपांतरण नहीं है। हालांकि एक कास्ट मान्य हो सकता है और यह संकलक द्वारा अनुमत है।

MyString a = "test"; 
object b = a; 
var c = (string)b; 
string d = a; 
var e = (string)a; 

चौथी लाइन रूप में माना जाएगा // funciton एक कस्टम रूपांतरण स्ट्रिंग d = MyString.op_implicit (क) के रूप में परिभाषित कॉल;

यह पांचवीं पंक्ति के लिए भी सच है। पांचवीं पंक्ति घटनाक्रम यह सिंटैक्स कास्ट के लिए नहीं है, यह एक रूपांतरण है।

हालांकि तीसरी पंक्ति एक कलाकार की तरह दिखती है और एक कलाकार है। एक कलाकार आप संकलक को बता रहे हैं कि आपके पास रनटाइम संकलन की तुलना में किसी ऑब्जेक्ट के प्रकार के संबंध में अधिक जानकारी है। (string)a संकलक को बताता है कि यह आश्वासन दिया जा सकता है कि ऑब्जेक्ट का प्रतिनिधित्व करने वाले ऑब्जेक्ट को रनटाइम प्रकार स्ट्रिंग होने वाला है। आपके मामले में यह सच नहीं है कि इसमें MyString टाइप है जो स्ट्रिंग से प्राप्त नहीं होता है (और स्ट्रिंग को सील कर दिया नहीं जा सकता है)।

बिंदु यह है कि घटनात्मक कस्टम रूपांतरण (या तो अंतर्निहित या स्पष्ट का उपयोग करके परिभाषित) में समान वाक्यविन्यास होता है क्योंकि वे कास्ट से पूरी तरह अलग होते हैं। एक डाली (इनहेरिट इंटरफेस सहित) आप को या एक कलाकारों के साथ श्रृंखला के नीचे जा सकते हैं लेकिन कभी

4

कस्टम अंतर्निहित/स्पष्ट ऑपरेटरों ही काम के बीच मूल्यों टाइप किया - नहीं object। इस तरह की कास्ट हमेशा एक मूल प्रकार की जांच या एक अनबॉक्स है। अंतर्निहित डाली है:

string s = a; 
-1

आप प्रयास करना चाहिए:

public MyString:String 
{ 
//code 
} 
+1

स्ट्रिंग सील कर दी गई है। – Jamiec

+0

ओह :) हाँ, आप सही हैं – asd007

2

आप के लिए अंतिम पंक्ति को बदलने की कोशिश कर सकते हैं:

string c = (string)((MyString)b);