Variable existiert im aktuellen Kontext nicht?

Ich weiß, dass das wahrscheinlich eine dumme Frage ist, aber ich bin ein Universitätsstudent, der neu in C # und objektorientierter Programmierung ist. Ich habe versucht, die Antwort woanders zu finden, aber ich konnte nichts finden, was helfen könnte. Der Debugger sagt mir immer wieder, dass die Variable ‘cust_num nicht im aktuellen Kontext existiert’. Wenn mir jemand sagen kann, was ich falsch gemacht habe und dass ich mich wie ein Idiot fühle, würde ich es sehr schätzen. Vielen Dank!

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

Jede Variable in C # existiert in einem Bereich, der durch geschweifte Klammern definiert ist:

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

In Ihrem Fall ist cust_num durch while {...} . Es muss darüber nachdenken, welchen Wert der Code zurückgeben soll, wenn cust_num_valid = true ist und kein cust_num vorhanden ist .

  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 

Um Ihren Code zu reparieren, setzen Sie die string cust_num = ""; außerhalb der 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; 

Definieren Sie es außerhalb der while :

 string cust_num = null; while ... 

und dann innerhalb der Weile setze es so:

 cust_num = Console.ReadLine(); 

weil Sie versuchen, nach der Weile darauf zuzugreifen:

 return cust_num; 

Ihre return cust_num statement liegt außerhalb des Definitionskontextes von cust_num . Da Sie es innerhalb Ihrer while Schleife definiert haben, existiert es nur in diesem Bereich. Sie müssen es aus der Schleife entfernen.

Jede von Ihnen definierte lokale Variable existiert nur innerhalb der geschweiften Klammern, die sie einkapseln (und in verschachtelten Klammern).

Sie versuchen, cust_num außerhalb des Bereichs des while Blocks zurückzugeben, in dem es definiert ist. Sie müssen es außerhalb der while definieren, wenn Sie es zurückgeben möchten, zum Beispiel:

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

Wenn eine Variable in einem Codeblock definiert ist, wird sie auf diesen Bereich beschränkt (und beginnt natürlich bei der Variablendeklaration; Sie können sie nicht vor ihrer Deklaration verwenden). Wenn Sie in Ihrem Beispiel nachsehen, wird die Variable im while-Block definiert, aber außerhalb davon verwendet.

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

Sie müssen es auf Methodenebene definieren, um es zu verwenden:

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

Anscheinend versuchen Sie, den Wert von cust_num . Um den Wert von cust_num , muss er außerhalb der while-Schleife auf der gleichen Ebene deklariert werden, auf der die “return” -statement auftritt.

Weitere Informationen finden Sie unter diesem Link: http://msdn.microsoft.com/en-us/library/ms973875.aspx