¿C # Switch / case comparte el mismo scope?

Posible duplicado:
Declaración de variable en c # instrucción switch

Siempre me he preguntado:

cuando yo escribo :

switch (temp) { case "1": int tmpInt = 1; break; } 

el case "1": región tiene una región de código que se ejecuta (hasta la ruptura)

ahora ,

una cascada desde arriba no puede entrar en un case of 2 por ejemplo:

  switch (temp) { case "1": int tmpInt = 1; case "2": break; } 

// error: falta el retorno de la rotura.

Así que supongo, tienen diferentes regiones de ejecuciones (caso … ruptura).

Entonces, ¿por qué aparecen estos errores?

introduzca la descripción de la imagen aquí

// la variable de conflicto tmpInt se define a continuación.

PD: esto es solo una pregunta tonta, aún interesante.

En C # el scope está determinado únicamente por llaves. Si no hay ninguno, no hay un scope separado. Con el switch / case obviamente no hay ninguno. Lo que usted llama “región de ejecución” no tiene nada que ver con lo que puede hacer referencia a una variable. Para un ejemplo artificial:

 int x = 1; goto foo; // This part gets never executed but you can legally refer to x here. foo: 

Puede hacer lo siguiente, sin embargo, si lo desea:

 switch (temp) { case "1": { int tmpint = 1; break; } case "2": { int tmpint = 1; break; } } 

De hecho, para algunas declaraciones de switch lo hago, porque hace la vida mucho más fácil al no contaminar otros case . A veces echo de menos a Pascal 😉

Con respecto a su bash de fracasar, debe hacerlo explícito en C # con goto case "2" .

Prueba esto

 int tmpInt = 0; switch (temp) { case "1": case "2": tmpInt = 1; break; } 

así que cuando el caso es 1 o 2, establecerá tmpint en 1

La sección 8.5.1 de la especificación del lenguaje C # dice:

El ámbito de una variable local declarada en una statement de variable local es el bloque en el que se produce la statement. Es un error referirse a una variable local en una posición textual que precede al declarador de variable local de la variable local. Dentro del scope de una variable local, es un error en tiempo de comstackción declarar otra variable o constante local con el mismo nombre.

El bloque en este caso es la instrucción de cambio, ya que los bloques están determinados por llaves.

Esto sucede porque está declarando una variable local con el mismo nombre en el mismo ámbito, tal como intellisense le dice cuando se desplaza sobre la línea de error.

Esta es la razón por la que realmente debes usar llaves en cada caso:

 switch(var) { case 1: { int temp=0; } break; case 2: { int temp=0; } break; } 

Esto soluciona el “problema” (que realmente no es un problema, así es como funcionan los ámbitos).

está creando la misma variable dos veces, es decir, int tmpInt = 1;