2010-11-26 12 views
6

सी # एक और क्षेत्र को संदर्भित करने के लिए एक उदाहरण क्षेत्र प्रारंभकर्ता अनुमति नहीं है।की वैचारिक कारण 'ए क्षेत्र प्रारंभकर्ता संदर्भ नहीं दे सकता गैर स्थिर क्षेत्र, विधि, या संपत्ति' CS0236 त्रुटि

class A 
{ 
string s1 = ""; 
string s2 = s1; 
} 

क्योंकि "s2" संदर्भ "एस 1": उदाहरण के लिए इस कोड को मान्य नहीं है।

लेकिन इसकी अनुमति क्यों नहीं है?

मेरी पहली सोचा था कि सी # चश्मा किसी भी आरंभीकरण आदेश की गारंटी नहीं है, लेकिन चश्मा क्रम के अनुसार घोषणा के क्रम में है:

चर initializers में शाब्दिक क्रम में क्रियान्वित कर रहे हैं जो वे कक्षा घोषणा में दिखाई देते हैं।

तो अगर आदेश निर्धारित है कि इस तरह के कोड के नुकसान क्या हो सकते हैं?

आपकी मदद के लिए अग्रिम धन्यवाद।

संपादित करें:

के जवाब के अनुसार HPS, 0xA3 और पीटर:

विरासत परिदृश्य में प्रारंभ की
  • क्रम बहुत भ्रामक हो सकता है,

  • ऐसी सुविधा को कार्यान्वित करना होगा थोड़ा लाभ के लिए संकलक विकास दल से कुछ संसाधनों की आवश्यकता,

  • यह (धन्यवाद पीटर) तार्किक कारणों के लिए विधि या गुण का उपयोग करना संभव नहीं है, तो स्थिरता के लिए एक ही क्षेत्रों के लिए सच है।

+0

यह ध्यान देने योग्य है कि vb।बेस-ऑब्जेक्ट निर्माण के बाद नेट रन फील्ड प्रारंभकर्ता, और उन्हें निर्मित वस्तु का संदर्भ देने की अनुमति देता है। मैं इसे एक अच्छी बात मानता हूं, खासतौर से उन मामलों में जहां क्षेत्रों में एक परिवर्तनीय संबंध मौजूद है। क्षेत्र प्रारंभकर्ताओं के लिए कन्स्ट्रक्टर पैरामीटर को उजागर करने से यह बेहतर होगा यदि कम प्रारंभिक थे। – supercat

उत्तर

4

यह आलेख आपके प्रश्न का उत्तर दे सकता है।

Execution Order

+1

तो, मूल रूप से आधार और व्युत्पन्न इनलाइन उदाहरण फ़ील्ड प्रारंभकर्ताओं के बीच निष्पादन आदेश निश्चित नहीं है। – Hps

+0

मैं नवीनीकरण नहीं कर सकता क्योंकि मेरी दैनिक सीमा तक पहुंच गई है लेकिन मैं निश्चित रूप से अगले दिन करूँगा। अच्छे लिंक के लिए धन्यवाद – TalentTuner

+0

इस लिंक के लिए धन्यवाद, इसमें कोई संदेह नहीं है कि इसका जवाब है। – Pragmateek

2

संकलक शायद क्षेत्रों के आदेश की जांच और उसके बाद यदि अन्य क्षेत्र पहले से घोषित किया गया है आरंभीकरण अनुमति दे सकता है।

आपके कोड को तोड़ने या पुन: संरचना करने वाले पतन के अलावा, संकलक को अनावश्यक रूप से जटिल क्यों होना चाहिए। संसाधन सीमित हैं, और संकलक टीम शायद उच्च प्राथमिकता वाली सुविधाओं पर काम करना पसंद करती है।

+0

इस टिप्पणी के लिए धन्यवाद। आपको सही होना चाहिए, कंपाइलर टीम अक्सर संसाधनों की कमी से सुविधाओं की कमी को औचित्य देती है। बहुत बुरा है कि उनके पास सी # बेहतर बनाने के लिए अधिक संसाधन नहीं हैं। – Pragmateek

5

मुझे किसी फ़ील्ड के बारे में निश्चित नहीं है, लेकिन यह क्षेत्र प्रारंभकर्ताओं को गुणों या विधियों तक पहुंच से इनकार करने के लिए तर्कसंगत लगता है। उदाहरण के लिए:

class A 
{ 
    string s1 = GetString(); 
    string s2 = this.MyString; 
    string s3 = "test"; 

    public string GetString() 
    { 
     // this method could use resources that haven't been initialized yet 
    } 

    public string MyString 
    { 
     get { return s3; } 
     // this field hasn't been initialized yet 
     // (okay, strings have a default value, but you get the picture) 
    } 
} 
+0

आप यहां बहुत अच्छा मुद्दा बनाते हैं, धन्यवाद। – Pragmateek

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

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