Переменная не существует в текущем контексте?

Я знаю, что это, скорее всего, глупый вопрос, но я студент университета, который новичок в 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;
    }

6 ответов


каждая переменная в 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; 

определите его вне while:

string cust_num = null;
while ...

а затем внутри в то время как установить его так:

cust_num = Console.ReadLine();

потому что вы пытаетесь получить к нему доступ после на пока:

return cust_num;

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

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


ты пытаешься вернуться 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;
}

когда переменная определена в блоке кода, она ограничена этой областью (и, конечно, начинается с объявления переменной; вы не можете использовать ее до ее объявления). Если вы посмотрите в своем примере, переменная определена в блоке 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

похоже, что вы пытаетесь вернуть значение cust_num. Для того, чтобы вернуть значение cust_num, Он должен быть объявлен вне цикла while на том же уровне, где происходит оператор "return".

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