2012-11-01 10 views
24

मुझे यह नहीं मिला। As ऑपरेटर:संरचनाओं पर ऑपरेटर के रूप में?

The as operator is used to perform certain types of conversions between compatible reference or nullable types.

तो फिर निम्न कार्य करती है?

struct Baby : ILive 
{ 
    public int Foo { get; set; } 

    public int Ggg() 
    { 
     return Foo; 
    } 
} 

interface ILive 
{ 
    int Ggg(); 
} 

void Main() 
{ 
    ILive i = new Baby(){Foo = 1} as ILive; // ?????? 
    Console.Write(i.Ggg());     // Output: 1 
} 
  • Baby एक struct, बनाने यह stack में मूल्य रखा जाएगा है। कोई संदर्भ यहां शामिल है।

  • निश्चित रूप से यहां कोई शून्य प्रकार नहीं हैं।

कोई स्पष्टीकरण कि मैं गलत क्यों हूं?

+0

बीटीडब्ल्यू, बेबी जैसे एक परिवर्तनीय वस्तु एक खराब संरचना बनाता है। एक वर्ग एक और अधिक स्पष्ट पसंद होगा। –

+0

@MarcGravell ऑफ कोर्स। लेकिन यह सवाल किनारे परिदृश्यों को बेहतर तरीके से जानने के लिए है। :-) –

उत्तर

34

इसे एक इंटरफेस के रूप में कास्टिंग प्रबंधित ढेर पर एक बॉक्स की गई प्रतिलिपि बनाएगा, और बॉक्स की गई प्रतिलिपि में एक संदर्भ वापस करेगा। बॉक्स इंटरफ़ेस लागू करता है।

+0

क्या तथ्य यह नहीं है कि इंटरफ़ेस System.object का वारिस नहीं करता है, इसके साथ कुछ लेना देना है? –

+4

@RoyiNamir कम से कम नहीं। इंटरफेस हमेशा संदर्भ-प्रकार होते हैं, जेनिक्स के मामूली अपवाद के साथ, जब वे * बाध्य * प्रकार (संदर्भ-प्रकार और मूल्य-प्रकार के बीच आधे रास्ते) –

9

यह काम करता है क्योंकि दायां हाथ एक इंटरफ़ेस है। शर्त यह है कि दाएं हाथ की ओर null मान के रूप में स्वीकार कर सकते हैं, यानी यह एक संदर्भ प्रकार या एक शून्य मूल्य प्रकार है। इंटरफेस एक संदर्भ प्रकार हैं। इस मामले में कोड संरचना को बॉक्स करेगा और फिर बॉक्स किए गए ऑब्जेक्ट को इंटरफ़ेस पर डालेगा।

+0

किसी भी इंटरफ़ेस का स्थिर प्रकार है, तो संदर्भ है। यदि आप किसी इंटरफ़ेस में मान प्रकार डालते हैं तो यह बॉक्स किया जाता है (आपको संदर्भ देता है)। तो इस संदर्भ में यह संदर्भ प्रकारों को बुलावा उचित है। – CodesInChaos

+0

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

0

आप बस संदर्भ प्रकार ILive शून्य मूल्य के साथ डाले गए हैं, इसलिए कोई त्रुटि नहीं फेंक दी गई है। हालांकि अगर आप इस टिप्पणी कोड को आजमाते हैं, तो आपको एक त्रुटि मिलेगी।

Baby b = new Baby(); 
object o = b; 
//Baby bb = o as Baby ; 

इसका कारण यह है कि आप मान प्रकार के as साथ कास्ट करने के लिए कोशिश कर रहे हैं और कहा कि नल नहीं हो सकता है।