2013-08-14 45 views
6

Tôi biết điều này rất có thể là một câu hỏi ngu ngốc nhưng tôi là một sinh viên đại học là người mới với C# và lập trình hướng đối tượng. Tôi đã cố gắng để tìm câu trả lời ở nơi khác nhưng tôi không thể tìm thấy bất cứ điều gì có thể giúp đỡ. Trình gỡ lỗi tiếp tục nói với tôi rằng biến 'cust_num không tồn tại trong ngữ cảnh hiện tại'. Nếu ai đó có thể cho tôi biết những gì tôi đã làm sai và làm cho tôi cảm thấy như một thằng ngốc, tôi sẽ đánh giá cao nó. Cảm ơn!Biến không tồn tại trong ngữ cảnh hiện tại?

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

Trả lời

4

Mỗi biến trong C# tồn tại trong một phạm vi được định nghĩa bởi dấu ngoặc nhọn:

{ 
    ... 
    int x = 0; 
    ... 
    x = x + 1; // <- legal 
    ... 
    // <- x is defined up to here 
} 

x = x - 1; // <- illegal, providing there's no other "x" declared 

Trong trường hợp của bạn, cust_num bị giới hạn bởi while {...}. Bạn phải suy nghĩ xem mã của mình nên trả lại giá trị nào nếu cust_num_valid = true và không có số nào là 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 

Để sửa chữa mã của bạn đặt string cust_num = "";ngoài các 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

Xác định nó ngoài while:

string cust_num = null; 
while ... 

và sau đó bên trong trong khi thiết lập nó như thế này:

cust_num = Console.ReadLine(); 

vì bạn đang cố gắng truy cập vào nó sau các trong khi:

return cust_num; 
+0

Là một thay thế: Bạn có thể tuyên bố 'chuỗi cust_num; '(không xác định' = null') bên ngoài vòng lặp và sử dụng một vòng lặp 'do {} while()' (vì vòng lặp sẽ luôn thực thi ít nhất một lần). – Nolonar

1

Câu lệnh return cust_num của bạn nằm ngoài ngữ cảnh định nghĩa của cust_num. Vì bạn đã xác định nó trong vòng lặp while của mình, nó chỉ tồn tại trong phạm vi đó. Bạn cần phải di chuyển nó ra khỏi vòng lặp.

Bất kỳ biến cục bộ nào bạn xác định chỉ tồn tại trong dấu ngoặc nhọn đóng gói nó (và trong bất kỳ dấu ngoặc ôm nào).

1

Bạn đang cố gắng trả lại cust_num bên ngoài phạm vi của khối while nơi được xác định. Bạn cần phải xác định nó ở bên ngoài trong khi nếu bạn muốn gửi lại, ví dụ:

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

Có vẻ như bạn đang cố gắng để trả về giá trị của cust_num. Để trả về giá trị của cust_num, nó cần phải được khai báo bên ngoài vòng lặp while ở cùng mức với câu lệnh "return" xuất hiện.

Xem liên kết này để biết thêm thông tin: http://msdn.microsoft.com/en-us/library/ms973875.aspx

+0

Đừng quên rằng nếu bạn nhận ra sau khi đăng câu trả lời khác (đã tốt hơn hoặc giống nhau) đã được đăng, bạn không mất phí để xóa bài đăng của mình để tránh làm lộn xộn câu hỏi với câu trả lời không thêm bất cứ điều gì. – Michelle

1

Khi một biến được định nghĩa trong một khối mã, người ta hạn chế phạm vi đó (và dĩ nhiên bắt đầu từ việc khai báo biến, bạn không thể sử dụng nó trước khi nó được công bố). Nếu bạn nhìn vào ví dụ của bạn, biến được định nghĩa trong khối trong khi, nhưng được sử dụng bên ngoài nó.

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

Bạn cần phải xác định nó ở cấp độ phương pháp để sử dụng nó:

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 để giáo dục về phạm vi – Habib

Các vấn đề liên quan