2013-08-14 5 views
6

Я знаю, что это, скорее всего, глупый вопрос, но я студент университета, который новичок в C# и объектно-ориентированном программировании. Я попытался найти ответ в другом месте, но я не смог найти ничего, что могло бы помочь. Отладчик продолжает говорить мне, что переменная '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

Каждая переменная в C# существует в объеме который определяется фигурных скобок:

{ 
    ... 
    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_num ограничено while {...}. Он должен подумать, какую ценность должен вернуть код, если 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') вне цикла и использования a 'do {} while()' loop (поскольку цикл будет выполняться хотя бы один раз). – Nolonar

1

Ваш оператор return cust_num находится вне контекста определения cust_num. Поскольку вы определили его внутри своего цикла while, он существует только в этой области. Вам нужно вывести его из цикла.

Любая локальная переменная, которую вы определяете, существует только внутри фигурных скобок, которые инкапсулируют ее (и в любые вложенные скобки).

1

Вы пытаетесь вернуть cust_num за пределы блока while, где он определен. Вам нужно определить его вне некоторое время, если вы хотите, чтобы вернуть его, например:

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, он должен быть объявлен вне цикла while на том же уровне, что и в случае, когда выполняется оператор return.

Смотрите эту ссылку для получения дополнительной информации: http://msdn.microsoft.com/en-us/library/ms973875.aspx

+0

Не забывайте, что если вы поймете, что после того, как вы отправили другой ответ (это лучше или то же самое), уже было отправлено, нет необходимости удалять сообщение, чтобы избежать проблем с ответами, которые ничего не добавляют. – Michelle

1

Когда переменная определена в блоке кода, он сдержанным в этой области видимости (и, конечно, начинается с объявления переменной, вы не можете использовать его, прежде чем он объявлен). Если вы посмотрите в своем примере, переменная определяется в блоке while, но используется за ее пределами.

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

Смежные вопросы