2009-05-14 18 views
8
... 
case 1: 
    string x = "SomeString"; 
    ... 
    break; 
case 2: 
    x = "SomeOtherString"; 
    ... 
    break; 
... 


¿Hay algo que no entiendo acerca de la declaración del interruptor en C#? ¿Por qué no sería un error cuando se usa el caso 2?
Editar: Este código funciona y no arroja un error.Inicialización de variable de conmutador C#: ¿Por qué este código NO provoca un error de compilación o un error de tiempo de ejecución?

+0

solo necesita poner la cadena x = "SomeOtherString"; entonces funcionará. el, no puede usar la variable del caso 1 en el caso 2. Se producirá un error fuera del alcance. –

+0

asegúrese de que el caso 2 requiera la modificación del código. –

+0

@Syed - eso no es correcto. NO se produce ningún error con este código. –

Respuesta

16

Hay que tener cuidado en cómo se piensa en la declaración switch aquí. No hay ninguna creación de ámbitos de variable pasando en absoluto, de hecho. No permita el hecho de que solo porque el código dentro de los casos se sangra porque reside dentro del alcance de un niño.

Cuando se compila un bloque de conmutadores, las etiquetas case simplemente se convierten en etiquetas, y la instrucción goto correspondiente se ejecuta al inicio de la instrucción de conmutación dependiendo de la expresión de conmutación. De hecho, puede usar manualmente las declaraciones goto para crear situaciones "fallidas" (que C# admite directamente), como sugiere the MSDN page.

goto case 1; 

Si quería específicamente para crear ámbitos para cada caso dentro del bloque switch, se puede hacer lo siguiente.

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

Esto requiere que redeclare la variable x (de lo contrario recibirá un error del compilador). El método de determinación del alcance de cada uno (o al menos algunos) puede ser bastante útil en ciertas situaciones, y ciertamente lo verá en el código de vez en cuando.

+0

por favor, corrija el caso 2, entonces su código estaría bien. –

+0

@Syed: Sí, quise señalar que para el bloque de conmutador de ámbito el compilador * generaría * un error. Lo he aclarado para mostrar que necesitas redefinir x en este caso. – Noldorin

+0

@Noldorin: Otra cosa que quiero hacerte saber es que su código no estaba recibiendo ningún error en el caso 2. Esto se debe a que ya definió la cadena x antes del cambio. Que se convierta en global y el caso 2 siempre se ejecuta sin ningún error. –

-2

mover la cadena a la declaración antes de la declaración

switch(value) 

. Luego asigna x para cada caso.

+0

No está preguntando CÓMO hacer que funcione ... pero por qué no hay error de compilación. – Inisheer

8

La documentación sobre MSDN dice:

El alcance de una variable local declarada en un interruptor de bloques de una sentencia switch (Sección 8.7.2) es el interruptor de bloque.

Además, una pregunta similar se ha hecho antes: Variable declaration in c# switch statement

+0

Gracias, no encontré la otra pregunta. –

0

si está creando cualquier variable local dentro de mayúsculas y minúsculas, no puede usarlas en mayúsculas y minúsculas.

... 
int opt ; 
switch(opt) 
{ 
case 1: 
{ 
    string x = "SomeString"; 
    ... 
} 
    break; 
case 2: 
{ 
    string x = "SomeOtherString"; 
    ... 
} 
    break; 
default: 
{ 
//your code 
} 
break; 
} 
... 
+0

si su caso contiene varias declaraciones, luego ponga {sus múltiples declaraciones entre paréntesis} y afuera ponga la ruptura; –

+0

ver el caso 2, no declaraste la cadena X, pero en mi caso 2, está correctamente definida –

+0

quien diga el voto, por favor especifica la razón, entonces sé lo que está mal con mi respuesta. –

4

No hay error de compilación porque la sentencia switch no crea un nuevo ámbito para las variables.

Si declara una variable dentro de un conmutador, la variable está en el mismo ámbito que el bloque de código que rodea el conmutador. Para cambiar este comportamiento, lo que tendría que añadir {}:

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

Esto hará que el compilador que se quejan. Sin embargo, el cambio, por sí solo, no hace esto internamente, por lo que no hay ningún error en su código.

1

Parece que el alcance de las variables está dentro del interruptor, no es el caso, probablemente porque los casos se pueden apilar. Observe que si intenta hacer referencia a x fuera del interruptor, fallará.

Cuestiones relacionadas