2010-02-02 8 views
9

El código funciona bien a continuación:Por qué no puede compilador de C# siga todas las rutas de código a través de una sentencia switch

ListControl lstMyControl; 

if (SomeVariable == SomeEnum.Value1) 
{ 
    lstMyControl = new DropDownList(); 
} 
else 
{ 
    lstMyControl = new RadioButtonList(); 
} 

lstMyControl.CssClass = "SomeClass"; 

Mientras que el código de abajo no se compilará:

ListControl lstMyControl; 

    switch (SomeVariable) 
    { 
     case SomeEnum.Value1: 
     lstMyControl = new DropDownList(); 
     break; 
     case default: 
     lstMyControl = new RadioButtonList(); 
     break; 
    } 

lstMyControl.CssClass = "SomeClass"; 

En el segundo ejemplo el compilador dice que estoy tratando de establecer una propiedad en una variable que no ha sido instanciada. En cualquier caso, lstMyControl debe crearse una instancia, pero el compilador no puede seguir esas rutas de código a través de la instrucción switch para ver eso. En el ejemplo simple anterior, simplemente usaría if/else. Pero algunas veces he querido hacer algo como esto con 10 clases diferentes que todas heredan de la misma clase base y tener 10 sentencias if/elseif es molesto cuando una instrucción switch es lo que debería estar usando.

+0

esperando respuesta allí ... Java no sería mordido de esa manera ... Y hubiera esperado que C# tampoco. – Romain

+0

if (SomeVariable = SomeEnum.Value1) <- ¿Seguro que esto no debería ser una comparación? if (SomeVariable == SomeEnum.Value1) –

+3

Encuentro que en su segundo ejemplo (como está escrito), el compilador realmente dice 'Error de sintaxis '(' expected 'en la línea donde tiene' case default: '. Corrija esto para 'default:' y presto, todo funciona. – AakashM

Respuesta

17
ListControl lstMyControl; 

    switch (SomeVariable) 
    { 
     case SomeEnum.Value1: 
     lstMyControl = new DropDownList(); 
     break; 
     default: //Don't prefix with "case" 
     lstMyControl = new RadioButtonList(); 
     break; 
    } 

lstMyControl.CssClass = "SomeClass"; 
+0

@JeffH, sí, acaba de compilar ese código y funciona para mí. No recuerdo si C# trató 'case default' de la misma manera que' default'. Me hubiera imaginado que C# desencadenaría un error de compilación en 'case default' realmente. – Earlz

+0

crea un error de compilación, "Error de sintaxis," ("esperado" se confunde un poco sobre el contexto en el que se usa "predeterminado" – Adrian

+0

Guau, sí, sí. Me pregunto de qué está hablando OP entonces? – Earlz

1

Funciona siempre que no marque "predeterminado" con "mayúscula" (como dice Earlz más arriba). Este fragmento compila bien. Sin embargo, estoy confundido por el mensaje de error que está viendo, eliminar el "caso" me da un error de sintaxis que no es lo que está viendo. ¿Hay algo más que esté pasando?

ListControl lstMyControl; 

int switchVar = 0; 
switch (switchVar) 
{ 
    case 1: 
     lstMyControl = new DropDownList(); 
     break; 
    default: 
     lstMyControl = new RadioButtonList(); 
     break; 
} 

lstMyControl.CssClass = "SomeClass"; 
Cuestiones relacionadas