2009-12-27 10 views
7

Soy nuevo en la programación y tener un problema con el código siguiente:problema # interruptor

private string alphaCoords(Int32 x) 
    { 
     char alphaChar; 

     switch (x) 
     { 
      case 0: alphaChar = 'A'; break; 
      case 1: alphaChar = 'B'; break; 
      case 2: alphaChar = 'C'; break; 
      case 3: alphaChar = 'D'; break; 
      case 4: alphaChar = 'E'; break; 
      case 5: alphaChar = 'F'; break; 
      case 6: alphaChar = 'G'; break; 
      case 7: alphaChar = 'H'; break; 
      case 8: alphaChar = 'I'; break; 
      case 9: alphaChar = 'J'; break; 
     } 

     return alphaChar.ToString(); 
    } 

El compilador dice: El uso de variable local no asignada 'alphaChar'

Pero estoy asignándole en mi bloque de interruptor.

Estoy seguro de que esto es mi culpa, ya que no sé lo suficiente sobre la programación.

Por favor, asesorar.

Gracias.

+0

Además, aquí hay un aviso: simplemente puede escribir 'int' en lugar de' Int32' si lo desea. Son sinónimos –

Respuesta

34

Lo está asignando si x es 0-9. ¿Qué esperarías que hiciera si x fuera 123 sin embargo? Mientras que usted puede saber que solo los valores entre 0 y 9 se pasarán, el compilador no lo hace - por lo que es necesita considerar lo que sucedería de lo contrario.

Una forma de evitar esto es tener un caso default en su sentencia switch, que se puede utilizar para lanzar una excepción si el valor no está en el rango esperado:

switch (x) 
{ 
    case 0: alphaChar = 'A'; break; 
    case 1: alphaChar = 'B'; break; 
    case 2: alphaChar = 'C'; break; 
    case 3: alphaChar = 'D'; break; 
    case 4: alphaChar = 'E'; break; 
    case 5: alphaChar = 'F'; break; 
    case 6: alphaChar = 'G'; break; 
    case 7: alphaChar = 'H'; break; 
    case 8: alphaChar = 'I'; break; 
    case 9: alphaChar = 'J'; break; 
    default: throw new ArgumentOutOfRangeException(); 
} 

Aquí está un poco más sencillo alternativa, sin embargo, que elimina por completo su sentencia switch:

if (x < 0 || x > 9) 
{ 
    throw new ArgumentOutOfRangeException(); 
} 
char alphaChar = (char)('A' + x); 

Tenga en cuenta que hace necesidad de tener cuidado al utilizar la aritmética como esta. En Java y C#, se garantiza que la representación subyacente será Unicode, lo que hace la vida mucho más fácil. Creo que está bien para cosas como esta (y para el análisis/formato hexadecimal), pero cuando te aventuras en escenarios más exóticos fallaría. Por otra parte, eso es cierto para muchas técnicas de simplificación de código ... si se aplican de manera inapropiada, terminas con un desastre.

+0

solo quiero manejar valores del 0 al 9. No se pasarán valores distintos a estos. – iTEgg

+0

@ikurtz: Entonces lanzar una excepción si hay * es * un valor distinto de 0 a 9 es lo correcto. –

+1

Pero el compilador no lo sabe y no puede verificarlo ni garantizarlo. –

2

Debe agregar un valor predeterminado a su instrucción de cambio.

El compilador indica que hay algunos casos que no asignarán un valor a la variable. Por lo que añadir

default: 
    alphaChar = 'x' 
break; 

le dirá al compilador "por lo que en caso de que se pierda un poco de escenario, hacer que el valor presente"

o en el caso de no querer asignar un defecto:

default: throw new Exception(); 

Esto no es necesariamente mejor sino otra forma de hacerlo:

private string alphaCoords(Int32 x) 
    { 
     if(x >= 0 && x =< 9) 
      return ((char)(x + 65)).ToString(); 
     else 
     throw new ArgumentException(); 
    } 
+0

No quiero agregar un valor predeterminado, ya que los valores solo pueden ser de 0 a 9. – iTEgg

0

El compilador no tiene forma de saber th en la variable x solo puede contener números hasta 9 (que es lo que verifica en su switch). Como la caja default falta en su interruptor, puede suponer que alphaChar permanece sin asignar. Puede agregar un caso default o asignarle un valor a la variable antes del switch.

0

Agregue un valor predeterminado a su interruptor, ya que si x es 10, nunca se le asignará alphaChar.

2

El compilador se queja porque alphaChar es posiblemente indefinido - si no es uno de los valores en su switch entonces no se han definido. Puede hacer una de las siguientes cosas:

  • Establezca un valor inicial de char que se llevará a cabo si ninguna de las condiciones del interruptor es verdadera.
  • Agregue una cláusula "predeterminada" a su declaración de cambio.
0

Después de declarar la variable char alphaChar, debe "asignarle" un valor (establecerlo para que sea igual a algo), aunque espere que obtenga un valor en la instrucción switch.

Puedes asignarle 'A' o '0' o casi cualquier cosa.

se puede hacer eso en la declaración como esta

char alphaChar = 'A'; 

o se puede hacer por separado

char alphaChar;  
alphaChar = 'A'; 
2

Antes de su primer uso variable local debe ser definitivamente asignado (según la normativa # Especificación C) . En este caso particular, la construcción del interruptor no garantiza que alphaChar se asigne definitivamente así el error del compilador. Puede proporcionar un valor inicial a alphaChar y, por lo tanto, se asignará definitivamente.

1

Está asignando valor a la variable alphaChar en función de alguna condición. Imagine un escenario donde la variable x contiene un valor distinto de 0 a 9. Suponga que contiene 10. Entonces ninguna de las condiciones del caso se cumplirá por x, por lo que alphaChar no se le asignará ningún valor, como resultado estará totalmente sin inicializar. Entonces, cuando está convirtiendo alphaChar en una cadena, está convirtiendo algún valor de basura en una cadena y devolviéndola al método de llamada. Esta es la razón por la cual recibes ese mensaje.

Si desea obtener una solución sencilla, a continuación, añadir el siguiente código a continuación

case 9: alphaChar = 'J'; 
     break; 

-

default: return null; 

y registro en los métodos de llamada si esta función alphaCoords devuelve un valor nulo o no, al igual esto -

if(alphaCooord(10) == null) 
{ 
    // x contains value other than 0 to 9 
} 
else 
{ 
    // x contains value between 0 to 9, so the returned value will be the string 
    // representation of the corresponding character 
} 

De esta manera su código no será demasiado complejo, o usted w no es necesario arrojar o manejar excepciones o algo así.

Espero que ayude :).