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