2013-08-14 12 views
6

मुझे पता है कि यह एक बेवकूफ सवाल है, लेकिन मैं एक विश्वविद्यालय का छात्र हूं जो सी # और ऑब्जेक्ट उन्मुख प्रोग्रामिंग के लिए नया है। मैंने जवाब कहीं और खोजने का प्रयास किया है, लेकिन मैं कुछ भी ढूंढने में सक्षम नहीं था जो मदद कर सकता था। डीबगर मुझे बताता रहता है कि परिवर्तनीय 'cust_num वर्तमान संदर्भ में मौजूद नहीं है'। अगर कोई मुझे बता सकता है कि मैंने क्या गलत किया है और मुझे बेवकूफ की तरह महसूस कर रहा है, तो मैं इसकी सराहना करता हूं। धन्यवाद!परिवर्तनीय वर्तमान संदर्भ में मौजूद नहीं है?

string get_cust_num() 
    { 
     bool cust_num_valid = false; 

     while (!cust_num_valid) 
     { 
      cust_num_valid = true; 
      Console.Write("Please enter customer number: "); 
      string cust_num = Console.ReadLine(); 

      if (cust_num == "000000" || !Regex.IsMatch(cust_num, @"^[0-9]+$") || cust_num.Length != 6) 
      { 
       cust_num_valid = false; 
       Console.WriteLine("Invalid customer number detected. Customer numbers must be a 6 digit positive integer (zeros will not work)"); 
      } 
     } 

     return cust_num; 
    } 

उत्तर

4

सी # में प्रत्येक चर एक गुंजाइश जो घुंघराले ब्रेसिज़ द्वारा परिभाषित किया गया है के भीतर मौजूद है:

{ 
    ... 
    int x = 0; 
    ... 
    x = x + 1; // <- legal 
    ... 
    // <- x is defined up to here 
} 

x = x - 1; // <- illegal, providing there's no other "x" declared 

आपके मामले में, cust_numwhile {...} द्वारा प्रतिबंधित है। यह सोचना होगा कि cust_num_valid = true पर आपका कोड कितना मूल्य लौटाएगा और cust_num बिल्कुल नहीं है।

while (!cust_num_valid) 
    { // <- Scope of cust_num begins 
     cust_num_valid = true; 
     Console.Write("Please enter customer number: "); 
     string cust_num = Console.ReadLine(); 

     if (cust_num == "000000" || !Regex.IsMatch(cust_num, @"^[0-9]+$") || cust_num.Length != 6) 
     { 
      cust_num_valid = false; 
      Console.WriteLine("Invalid customer number detected. Customer numbers must be a 6 digit positive integer (zeros will not work)"); 
     } 
    } // <- Scope of cust_num ends 

    return cust_num; // <- out of scope 

अपने कोड बाहर string cust_num = "";डाल while सुधारने के लिए:

string cust_num = ""; // <- declaration 

    while (!cust_num_valid) 
    { 
     cust_num_valid = true; 
     Console.Write("Please enter customer number: "); 
     cust_num = Console.ReadLine(); // <- no new declaration: "string" is removed 

     if (cust_num == "000000" || !Regex.IsMatch(cust_num, @"^[0-9]+$") || cust_num.Length != 6) 
     { 
      cust_num_valid = false; 
      Console.WriteLine("Invalid customer number detected. Customer numbers must be a 6 digit positive integer (zeros will not work)"); 
     } 
    } 

    return cust_num; 
9

while बाहर यह निर्धारित करें:

string cust_num = null; 
while ... 

और फिर, जबकि यह इस तरह सेट के अंदर:

cust_num = Console.ReadLine(); 

क्योंकि आपके बाद यह का उपयोग करने की कोशिश कर रहे हैं जबकि:

return cust_num; 
+0

एक विकल्प के रूप: आप 'स्ट्रिंग cust_num घोषणा कर सकते हैं;' पाश और उपयोग के बाहर (परिभाषित करने '= null' के बिना) एक 'do {} जबकि() 'लूप (चूंकि लूप हमेशा कम से कम एक बार निष्पादित होगा)। – Nolonar

1

आपका return cust_num कथन cust_num की परिभाषा संदर्भ के बाहर है। चूंकि आपने इसे अपने while लूप के अंदर परिभाषित किया है, यह केवल उस दायरे में मौजूद है। आपको इसे लूप से बाहर ले जाने की जरूरत है।

आपके द्वारा परिभाषित किया गया कोई भी स्थानीय चर केवल घुंघराले ब्रैकेट के भीतर मौजूद है (और किसी भी नेस्टेड ब्रैकेट में)।

1

आप while ब्लॉक के दायरे के बाहर cust_num वापस करने की कोशिश कर रहे हैं जहां इसे परिभाषित किया गया है।

string get_cust_num() 
{ 
    bool cust_num_valid = false; 
    string cust_num = string.Empty; 
    while (!cust_num_valid) 
    { 
     cust_num_valid = true; 
     Console.Write("Please enter customer number: "); 
     cust_num = Console.ReadLine(); 

     if (cust_num == "000000" || !Regex.IsMatch(cust_num, @"^[0-9]+$") || cust_num.Length != 6) 
     { 
      cust_num_valid = false; 
      Console.WriteLine("Invalid customer number detected. Customer numbers must be a 6 digit positive integer (zeros will not work)"); 
     } 
    } 

    return cust_num; 
} 
0

ऐसा लगता है कि आप cust_num का मान देने के लिए कोशिश कर रहे हैं: आप थोड़ी देर के बाहर यह परिभाषित करने के लिए यदि आप इसे वापस करने के लिए, उदाहरण के लिए इच्छा की जरूरत है। cust_num के मान को वापस करने के लिए, इसे उसी स्तर पर थोड़ी देर के लूप के बाहर घोषित करने की आवश्यकता है जहां "वापसी" कथन होता है।

अधिक जानकारी के लिए इस लिंक देखें: http://msdn.microsoft.com/en-us/library/ms973875.aspx

+0

यह मत भूलना कि अगर आपको एक और उत्तर पोस्ट करने के बाद एहसास हुआ है (यह बेहतर है या वही है) पहले से ही पोस्ट कर दिया गया है, तो कुछ भी जोड़ने वाले उत्तरों के साथ छेड़छाड़ करने वाले प्रश्नों से बचने के लिए अपनी पोस्ट को हटाने की कोई कीमत नहीं है। दायरे के बारे में शिक्षित करने के लिए – Michelle

1

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

string get_cust_num() 
{ 
    while() 
    { 
     string cust_num = Console.ReadLine(); // cust_num scope starts here 
     if() 
     { 
     } 
    } // cust_num scope ends here 
    return cust_num; 
} 

आप इसे उपयोग करने के लिए विधि स्तर पर इसे परिभाषित करने की जरूरत:

string get_cust_num() 
{ 
    string cust_num = Console.ReadLine(); // cust_num scope starts here 

    while() 
    { 
     if() 
     { 
     } 
    } 

    return cust_num; 
} // cust_num scope ends here 
+0

+1 – Habib

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