जिस कारण से आपको फॉर-लूप और फॉर-लूप दोनों में एक ही नाम के साथ एक वैरिएबल को परिभाषित करने की अनुमति नहीं है, क्योंकि बाहरी-दायरे में वैरिएबल इनर-स्कोप में मान्य हैं। इसका मतलब है कि अगर अनुमति दी गई थी तो लूप के भीतर दो 'i' वैरिएबल होंगे।
देखें: MSDN स्कोप्स
विशेष रूप से:
स्थानीय-चर-घोषणा (धारा 8.5.1) में घोषित स्थानीय चर का दायरा वह खंड है जिसमें घोषणा होती है।
तथा
किसी कथन के लिए-प्रारंभ-प्रारंभकर्ता (धारा is. is.३) में घोषित एक स्थानीय चर का दायरा, प्रारंभिक-प्रारंभक, for-condition, for-iterator, और कथन के लिए निहित कथन है।
और भी: स्थानीय चर घोषणाएं (सी # विनिर्देश की धारा 8.5.1)
विशेष रूप से:
स्थानीय चर-घोषणा में घोषित स्थानीय चर का दायरा वह खंड होता है जिसमें घोषणा होती है। स्थानीय चर को स्थानीय चर के स्थानीय-चर-घोषणाकर्ता से पहले एक स्थानीय चर को संदर्भित करना एक त्रुटि है।स्थानीय चर के दायरे में, एक अन्य स्थानीय चर या एक ही नाम के साथ स्थिर घोषित करने के लिए एक संकलन-समय त्रुटि है।
(जोर मेरा)
जिसका अर्थ है कि i
आपके लूप के अंदर का दायरा फॉर-लूप है। जबकि i
आपके फॉर-लूप के बाहर का दायरा पूरी मुख्य विधि है और फॉर-लूप है। मतलब आपके पास दो घटनाएं होंगीi
लूप अंदर होंगी जो उपरोक्त के अनुसार अमान्य है।
कारण यह है कि आपको करने की अनुमति नहीं int A = i;
है क्योंकि लूप के int i
भीतर उपयोग के लिए केवल स्कूप किया गया for
है। इस प्रकार यह अब for
लूप के बाहर सुलभ नहीं है ।
जैसा कि आप देख सकते हैं कि ये दोनों मुद्दे स्कूपिंग का परिणाम हैं; पहला अंक ( int i = 4;
) लूप स्कोप के i
भीतर दो चर में होगा for
। जबकि int A = i;
इसके परिणामस्वरूप एक वैरिएबल का उपयोग होगा जो कि दायरे से बाहर है।
इसके बजाय आप जो कर सकते हैं i
, उसे पूरी विधि से करने की घोषणा की जाती है, और फिर दोनों विधि के साथ-साथ लूप स्कोप के लिए भी इसका उपयोग करें। यह या तो नियम तोड़ने से बच जाएगा।
public static void Main()
{
int i;
for (i = 0; i < 5; i++)
{
}
// 'i' is only declared in the method scope now,
// no longer in the child scope -> valid.
i = 4;
// 'i' is declared in the method's scope -> valid.
int A = i;
}
संपादित करें :
इस कोड को काफी मान्य रूप से संकलित करने की अनुमति देने के लिए C # संकलक को निश्चित रूप से बदला जा सकता है। आखिर यह मान्य है:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
लेकिन क्या यह वास्तव में आपके कोड की पठनीयता और रखरखाव के लिए फायदेमंद होगा, जैसे कि कोड लिखने में सक्षम होना:
public static void Main()
{
int i = 4;
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Console.WriteLine(i);
}
यहां गलतियों के बारे में सोचें, क्या आखिरी i
प्रिंट 0 या 4 है? अब यह एक बहुत छोटा सा उदाहरण है, जिसे फॉलो करना और ट्रैक करना काफी आसान है, लेकिन यह निश्चित रूप से बहुत कम रख-रखाव और पठनीय है, i
जिसे एक अलग नाम से बाहरी घोषित किया गया है ।
ध्यान दें:
कृपया ध्यान दें, C # के स्कोपिंग नियम C ++ के स्कोपिंग नियमों से भिन्न हैं । सी ++ में चर केवल उस दायरे में होते हैं जहां से उन्हें ब्लॉक के अंत तक घोषित किया जाता है। जो आपके कोड को C ++ में वैध निर्माण बना देगा।