सी # नाम छिपाने के नियम काफी जटिल हैं। भाषा आपके द्वारा उल्लेख किए जाने वाले मामले की अनुमति देती है, लेकिन कई समान मामलों को अस्वीकार करती है। इस जटिल विषय पर कुछ जानकारी के लिए
http://ericlippert.com/2009/11/02/simple-names-are-not-so-simple/
देखें।
अपने विशिष्ट प्रश्न को संबोधित करने के लिए: संकलक निश्चित रूप से उस संघर्ष का पता लगा सकता है।
class P
{
int x;
void M()
{
x = 123; // The author intends "this.x = 123;"
int x = 0;
}
}
बराबर सी ++ प्रोग्राम कानूनी सी होगा ++, क्योंकि C++ एक स्थानीय चर इसकी घोषणा के बिंदु पर गुंजाइश में आता है: वास्तव में, यह कि संघर्ष पहचानता है। सी # में, एक स्थानीय चर अपने पूरे ब्लॉक में दायरे में है, और इसकी घोषणा से पहले इसका उपयोग अवैध है। आप इस कार्यक्रम के संकलन का प्रयास करें आपको मिलेगा:
error CS0844: Cannot use local variable 'x' before it is declared.
The declaration of the local variable hides the field 'P.x'.
देखें: स्थानीय घोषणा क्षेत्र छुपाता है।संकलक इसे जानता है। तो क्यों आपके मामले में यह एक क्षेत्र छिपाने के लिए त्रुटि नहीं है?
मान लीजिए कि तर्क के लिए यह एक त्रुटि होनी चाहिए। क्या यह भी एक त्रुटि होनी चाहिए?
class B
{
protected int x;
}
class D : B
{
void M()
{
int x;
}
}
क्षेत्र एक्स बी से डी के एक सदस्य विरासत के माध्यम से तो यह भी एक त्रुटि, सही होना चाहिए?
अब मान लीजिए कि आप इस कार्यक्रम फू निगम द्वारा निर्मित है:
class B
{
}
और इस कार्यक्रम बार निगम द्वारा उत्पादित:
class D : B
{
void M()
{
int x;
}
}
संकलित है। अब मान लीजिए कि फू कॉर्प उनके आधार वर्ग और जहाजों एक नया संस्करण अद्यतन करता है आप के लिए बाहर:
class B
{
protected int x;
}
तुम मुझे कि हर व्युत्पन्न वर्ग है कि अब संकलित करने के लिए असफल हो जाना चाहिए एक स्थानीय x नामित चर शामिल कह रहे हैं?
यह डरावना होगा। हमें स्थानीय चर को छाया सदस्यों को अनुमति देना है।
और यदि हम स्थानीय वर्गों को आधार वर्गों के सदस्यों को छायांकित करने की अनुमति देने जा रहे हैं, तो यह स्थानीय लोगों को कक्षाओं के सदस्यों को छाया देने की इजाजत नहीं देता है।
आप 'x' और' this.x' का उल्लेख कर सकते हैं, इसलिए कोई समस्या नहीं है। – Blorgbeard
असल में यह संगत है। यदि आपके पास शून्य foo() फ़ंक्शन में x = 0 था तो यह एक्स से वैरिएबल उठाएगा जिसे आपने पहले परिभाषित किया था। क्योंकि आपके पास int x = 0 है जिस विधि में आपके इरादे के लिए एक नया वैरिएबल तत्काल है। लेकिन यदि आप foo विधि के बाहर x के मान को देखते हैं तो यह अभी भी 0 होगा क्योंकि आप एक अलग दायरे में हैं। – Brian
यदि आप क्लास सदस्य के समान नाम के साथ स्थानीय वैरिएबल प्राप्त करने में सक्षम नहीं होना चाहते हैं, तो आप रीशेपर प्राप्त कर सकते हैं और [इसे आपको ऐसा करने से रोक सकते हैं] (http://confluence.jetbrains.net/display/ReSharper/लोकल + चर + खाल + सदस्य)। – AakashM