Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Variable does not exist in the current context?

Tags:

scope

c#

return

I know this is most likely a stupid question but I am a university student who is new to C# and object-oriented programming. I have tried to find the answer elsewhere but I wasn't able to find anything that could help. The debugger keeps telling me that the variable 'cust_num does not exist in the current context'. If someone can tell me what I have done wrong and make me feel like an idiot, I would greatly appreciate it. Thanks!

    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;
    }
like image 319
SuperDicko Avatar asked Aug 14 '13 13:08

SuperDicko


People also ask

Does variable_name exist in the current context?

The name `variable_name` does not exists in the current context. This is decompiled code, but even here it works for some local variables. What could be the fix for this?

Why can't I see variable values in the Immediate window?

If you are trying to debug in a release build (release mode instead of debug mode), you'll get this error. Change your solution configuration to Debug (Any CPU) and you'll be able to see variable values in the immediate window.

Can a variable be defined in a while Block?

When a variable is defined in a code block, it is restrained to that scope (and of course starts at the variable declaration; you cannot use it before it is declared). If you look in your example, the variable is defined in the while block, but used outside of it. Show activity on this post.

Why are my local variables not showing up in Visual Studio?

It's possible the local variables have been optimised away by the JIT compiler. Since you're using Visual Studio you might be able to switch the configuration to Debug and rebuild. If not, you can configure the JIT compiler to disable optimisations and generate tracking information - see here on how to set the configuration.


3 Answers

Define it outside the while:

string cust_num = null;
while ...

and then inside the while set it like this:

cust_num = Console.ReadLine();

because you're trying to access it after the while:

return cust_num;
like image 121
Mike Perrenoud Avatar answered Oct 18 '22 14:10

Mike Perrenoud


Each variable in C# exists within a scope which is defined by curly braces:

{ 
  ...
  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 your case, cust_num is restricted by while {...}. It has to think what value should your code return if cust_num_valid = true and there's no cust_num at all.

  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

To repair your code put string cust_num = ""; outside the 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; 
like image 23
Dmitry Bychenko Avatar answered Oct 18 '22 13:10

Dmitry Bychenko


Your return cust_num statement is outside of the definition context of cust_num. Since you defined it inside your while loop, it exists only in that scope. You need to move it out of the loop.

Any local variable you define exists only within the curly brackets that encapsulate it (and in any nested brackets).

like image 30
Artless Avatar answered Oct 18 '22 14:10

Artless