2010-06-28 12 views
7

उदाहरण:लैम्ब्डा चर गुंजाइश

myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh"); 

var s = "s"; 

एक चर "एस" एक लैम्ब्डा और अन्य चर "एस" एक ही विधि के भीतर एक स्थानीय चर के रूप में में परिभाषित किया गया है। जब मैं पहले "एस" पर होवर करता हूं तो विजुअल स्टूडियो मुझे बताता है "एक विरोधाभासी चर नीचे परिभाषित किया गया है"। ये विरोधाभासी क्यों हैं; लैम्बडा में "एस" निश्चित रूप से इसके संलग्न ब्रैकेट के बाहर उपलब्ध नहीं है?

+0

देखें: http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are -not-so-simple.aspx –

उत्तर

8

वे परस्पर विरोधी हैं क्योंकि सी # का एक नियम है कि एक ही सरल नाम के किसी भी दो का उपयोग करता है तुरंत उनमें से या तो संलग्न दो अलग बातें ब्लॉक के अंदर के संदर्भ में प्रयुक्त नहीं किया जा सकता है। आपके उदाहरण में सरल नाम "एस" का उपयोग स्थानीय परिवर्तनीय घोषणा को अवरुद्ध करने वाले ब्लॉक के अंदर दो चीजों के लिए किया जाता है: इसका मतलब स्थानीय चर, और एक लैम्ब्डा पैरामीटर है। कि अवैध है। मैं ध्यान दें कि त्रुटि संदेश आपको मिल आप यह बताता है:

 
A local variable named 's' cannot be declared in this scope because it 
would give a different meaning to 's', which is already used in a 
'child' scope to denote something else 

सी #, तुम क्योंकि बहुत कोड त्रुटि, प्रवण संपादित करने के लिए कठिन बना देता है कर रही है करने के लिए एक ही सरल नाम एक ही ब्लॉक में दो बातें मतलब की अनुमति नहीं है मुश्किल पढ़ने के लिए, refactor करने के लिए मुश्किल, और डीबग करने के लिए मुश्किल है। यह खराब प्रोग्रामिंग अभ्यास को अस्वीकार करना बेहतर है और इसे अनुमति देने के बजाय आपको लगता है कि "एस" का मतलब पूरे ब्लॉक में एक ही चीज़ है।

जब कोड केवल दो पंक्तियों तक लंबा होता है तो यह याद रखना आसान होता है कि एस के लिए दो अलग-अलग अर्थ हैं, लेकिन जब यह सैकड़ों लाइन लंबी है, तो इतना आसान नहीं है।

इस नियम के बारे में अधिक जानकारी के लिए देखें:

http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx

+0

हम्म, मुझे आपकी पोस्टिंग के बारे में कुछ याद आया। मुझे सही करने के लिए धन्यवाद। –

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