La variable n’existe pas dans le contexte actuel?

Je sais que c’est probablement une question stupide, mais je suis un étudiant universitaire qui débute dans la programmation C # et orientée object. J’ai essayé de trouver la réponse ailleurs mais je n’ai rien trouvé qui puisse aider. Le débogueur n’arrête pas de me dire que la variable ‘cust_num n’existe pas dans le contexte actuel’. Si quelqu’un pouvait me dire ce que j’avais mal fait et me faire sentir comme un idiot, je l’apprécierais grandement. Merci!

ssortingng get_cust_num() { bool cust_num_valid = false; while (!cust_num_valid) { cust_num_valid = true; Console.Write("Please enter customer number: "); ssortingng 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; } 

Chaque variable en C # existe dans une scope définie par des accolades :

 { ... int x = 0; ... x = x + 1; // <- legal ... // <- x is defined up to here } x = x - 1; // <- illegal, providing there's no other "x" declared 

Dans votre cas, cust_num est limité par while {...} . Il doit réfléchir à la valeur que votre code doit renvoyer si cust_num_valid = true et qu'il n'y a pas cust_num du tout.

  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 

Pour réparer votre code, mettez la ssortingng cust_num = ""; en dehors du while :

  ssortingng 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; 

Définissez-le en dehors du while :

 ssortingng cust_num = null; while ... 

puis à l’intérieur, définissez-le comme suit:

 cust_num = Console.ReadLine(); 

parce que vous essayez d’y accéder après tout ce temps :

 return cust_num; 

Votre return cust_num situe en dehors du contexte de définition de cust_num . Comme vous l’avez défini dans votre boucle while, il n’existe que dans cette étendue. Vous devez le sortir de la boucle.

Toute variable locale que vous définissez existe uniquement entre les accolades qui l’encapsulent (et entre tous les crochets nesteds).

Vous essayez de renvoyer cust_num dehors de la scope du bloc while où il est défini. Vous devez le définir en dehors de tout moment si vous souhaitez le retourner, par exemple:

 ssortingng get_cust_num() { bool cust_num_valid = false; ssortingng cust_num = ssortingng.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; } 

Lorsqu’une variable est définie dans un bloc de code, elle est restreinte à cette scope (et commence bien sûr à la déclaration de la variable; vous ne pouvez pas l’utiliser avant sa déclaration). Si vous regardez dans votre exemple, la variable est définie dans le bloc while, mais utilisée en dehors de celui-ci.

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

Vous devez le définir au niveau de la méthode pour l’utiliser:

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

Il semble que vous tentiez de renvoyer la valeur cust_num . Afin de renvoyer la valeur de cust_num , elle doit être déclarée en dehors de la boucle while au même niveau que l’instruction “return”

Consultez ce lien pour plus d’informations: http://msdn.microsoft.com/en-us/library/ms973875.aspx