2015-10-01 4 views
7

मैं सिर्फ देखा है कि निम्नलिखित सी दृश्य स्टूडियो 2015 में लिखा # में संभव है, लेकिन मैं इसे पहले कभी नहीं देखा है:नया सी # 6 ऑब्जेक्ट प्रारंभकर्ता वाक्यविन्यास?

public class X 
{ 
    public int A { get; set; } 

    public Y B { get; set; } 
} 

public class Y 
{ 
    public int C {get; set; } 
} 

public void Foo() 
{ 
    var x = new X { A = 1, B = { C = 3 } }; 
} 

मेरे उम्मीद फू इस तरह लागू किया जा करने के लिए के लिए किया गया था:

public void Foo() 
{ 
    var x = new X { A = 1, B = new Y { C = 3 } }; 
} 

ध्यान दें कि new Y पर कॉल करने की आवश्यकता नहीं है।

क्या यह नया सी # 6 में है? मैंने release notes में इसका कोई उल्लेख नहीं देखा है, तो शायद यह हमेशा वहां रहा है?

+0

की संभावित डुप्लिकेट (http://stackoverflow.com/questions/32342188/c-sharp- ऑब्जेक्ट-प्रारंभिक-बग) –

उत्तर

11

यदि आप यह कोड चलाते हैं तो आपको एक NullReferenceException मिलेगा।

यह Y का एक उदाहरण नहीं बनाएगा, यह X.B संपत्ति के गेटर फोन और संपत्ति सी

यह हमेशा की तरह काम किया मान असाइन करने की कोशिश करेंगे। सी # 5.0 भाषा विनिर्देश के अनुसार:

एक सदस्य प्रारंभकर्ता कि एक ऑब्जेक्ट प्रारंभकर्ता के बाद बराबर चिह्न निर्दिष्ट करता है एक नेस्टेड ऑब्जेक्ट प्रारंभकर्ता, यानि कि एक एम्बेडेड वस्तु का एक प्रारंभ है। क्षेत्र या संपत्ति के लिए एक नया मूल्य आवंटित करने के बजाय, नेस्टेड ऑब्जेक्ट प्रारंभकर्ता में असाइनमेंट को फ़ील्ड या संपत्ति के सदस्यों को असाइनमेंट के रूप में माना जाता है।

+0

आप सही हैं, धन्यवाद। इसलिए हम 'सार्वजनिक वाई बी' प्राप्त करने के लिए 'X.B' की घोषणा को बदल सकते हैं; } = नया वाई(); 'और यह कोड अपेक्षित के रूप में काम करेगा। अजीब है कि मैंने कभी इस वाक्यविन्यास को कभी नहीं देखा है! – jonnystoten

+2

यह सुविधा सी # 3.0 में पेश की गई थी – Vova

6

यह सुविधा सी # 3.0 में ऑब्जेक्ट प्रारंभकर्ता के रूप में पेश की गई थी।

पी पर उदाहरण देखें। C# Language 3.0 specification 169: [? सी # वस्तु प्रारंभ बग]

Rectangle r = new Rectangle { 
    P1 = { X = 0, Y = 1 }, 
    P2 = { X = 2, Y = 3 } 
}; 

जो

जैसा ही होता है
Rectangle __r = new Rectangle(); 
__r.P1.X = 0; 
__r.P1.Y = 1; 
__r.P2.X = 2; 
__r.P2.Y = 3; 
Rectangle r = __r; 
संबंधित मुद्दे