tipos - switch en c# consola
¿Cuál es la diferencia y por qué Switch Case funciona así en C#? (2)
Básicamente, la declaración de variables es efectivamente más amplia de lo que piensas; el segundo ejemplo adolece de "asignación definida", ya que se declara (más amplio), pero no se asigna realmente, por lo que ++
no tiene sentido en un valor no asignado.
Si quieres ámbitos por case
, puedes hacerlo ... solo agrega llaves:
switch (x)
{
case 1:
{
uint cId = (uint)3;
break;
}
case 2:
{
uint cId = (uint)5;
break;
}
}
¿Es un poco molesto? Sí. ¿Es anti-intuitivo? Sí. ¿Alguna vez será cambiado? Es poco probable, ya que sería un cambio importante que impediría la compilación de muchos de los C # existentes.
Esta pregunta ya tiene una respuesta aquí:
Tengo dos funciones, una puede ser compilada y la otra no. ¿Cuál es la diferencia?
¿La función número 1 supone que el caso 1 siempre será afectado, o solo es un problema del compilador?
public void Test(int x)
{
switch (x)
{
case 1:
uint cId = (uint)3;
break;
case 2:
cId = (uint)5; //NO ERROR HERE. WHY?
break;
}
}
public void DeclaringInsideSwitch(int x)
{
uint tst = 0;
switch (x)
{
case 1:
int y = 3;
uint variable = tst;
break;
case 2:
variable++; //ERROR HERE. WHY?
break;
}
}
Intenté, por supuesto, buscar "Declarar variables dentro del conmutador en C #", pero a mi me parece un error en C # ahora, conservado para compatibilidad con versiones anteriores.
// Después de recibir una advertencia de que ya fue respondida, mi pregunta ahora puede reducirse a lo que realmente se trata.
Por qué:
int x;
x++;
no funciona esto?
Bueno, uint cId
se define dentro del alcance {...}
que está en su switch scope
caso
switch (x)
{
case 1:
uint cId = (uint)3; // <- definition
break;
case 2:
// cId has been defined and thus can be assigned (initialization)
cId = (uint)5; //NO ERROR HERE WHY?
break;
} // <- end of cId scope
En el segundo caso variable
se define la variable
, pero al ser una variable local se debe inicializar antes de su uso (incremento):
switch (x)
{
case 1:
int y = 3;
uint variable = tst; // <- definition
break;
case 2:
// variable defined, but has not been initialized ("case 1:" hasn''t been run),
// variable contains trash and so you can''t increment it
variable++; //ERROR HERE WHY?
break;
} // <- end of variable scope