Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# switch variable initialization: Why does this code NOT cause a compiler error or a runtime error?

...
case 1:
   string x = "SomeString";
   ...
   break;
case 2:
   x = "SomeOtherString";
   ...
   break;
...


Is there something that I am not understanding about the switch statement in C#? Why would this not be an error when case 2 is used?
Edit: This code works and doesn't throw an error.

like image 378
Jeremy Cron Avatar asked May 14 '09 15:05

Jeremy Cron


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.

What is C in C language?

What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.

Is C language easy?

C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.


4 Answers

You have to be careful how you think about the switch statement here. There's no creation of variable scopes going on at all, in fact. Don't let the fact that just because the code within cases gets indented that it resides within a child scope.

When a switch block gets compiled, the case labels are simply converted into labels, and the appropiate goto instruction is executed at the start of the switch statement depending on the switching expression. Indeed, you can manually use goto statements to create "fall-through" situations (which C# does directly support), as the MSDN page suggests.

goto case 1;

If you specifically wanted to create scopes for each case within the switch block, you could do the following.

...
case 1:
{
   string x = "SomeString";
   ...
   break;
}
case 2:
{
   string x = "SomeOtherString";
   ...
   break;
}
...

This requires you to redeclare the variable x (else you will receive a compiler error). The method of scoping each (or at least some) can be quite useful in certain situations, and you will certainly see it in code from time to time.

like image 186
Noldorin Avatar answered Oct 27 '22 09:10

Noldorin


The documentation on MSDN says :

The scope of a local variable declared in a switch-block of a switch statement (Section 8.7.2) is the switch-block.

Also, a similar question has been asked before: Variable declaration in c# switch statement

like image 43
Lars A. Brekken Avatar answered Oct 27 '22 09:10

Lars A. Brekken


There is no compiler error because the switch statement does not create a new scope for variables.

If you declare a variable inside of a switch, the variable is in the same scope as the code block surrounding the switch. To change this behavior, you would need to add {}:

...
case 1:
    // Start a new variable scope 
    {
        string x = "SomeString";
        ...
    }
    break;
case 2:
    {
        x = "SomeOtherString";
        ...
    }
    break;
...

This will cause the compiler to complain. However, switch, on it's own, doesn't internally do this, so there is no error in your code.

like image 35
Reed Copsey Avatar answered Oct 27 '22 08:10

Reed Copsey


It looks like the scoping of variables is within the switch, not the case, probably because cases can be stacked. Notice if you try to reference x outside of the switch it will fail.

like image 45
D'Arcy Rittich Avatar answered Oct 27 '22 08:10

D'Arcy Rittich