Pregunta

No estoy seguro de por qué recibo este error, pero ¿no debería compilar este código, ya que ya estoy verificando si la cola se está inicializando?

public static void Main(String[] args)
{
    Byte maxSize;
    Queue queue;

    if(args.Length != 0)
    {
        if(Byte.TryParse(args[0], out maxSize))
            queue = new Queue(){MaxSize = maxSize};
        else
            Environment.Exit(0);
    }
    else
    {
        Environment.Exit(0);
    }

    for(Byte j = 0; j < queue.MaxSize; j++)
        queue.Insert(j);
    for(Byte j = 0; j < queue.MaxSize; j++)
        Console.WriteLine(queue.Remove());
}

Entonces, si la cola no se inicializa, los bucles for no son accesibles, ¿verdad? Dado que el programa ya termina con Environment.Exit (0)?

Espero que puedas darme algunos consejos :)

Gracias.

¿Fue útil?

Solución

El compilador no sabe que Environment.Exit () terminará el programa; solo te ve ejecutando un método estático en una clase. Simplemente inicialice queue a null cuando lo declare.

Queue queue = null;

Otros consejos

El compilador no sabe que Environment.Exit () no regresa. ¿Por qué no solo " retorno " de Main ()?

Un par de maneras diferentes de resolver el problema:

Simplemente reemplace Environment.Exit con return. El compilador sabe que return finaliza el método, pero no sabe que Environment.Exit sí lo hace.

static void Main(string[] args) {
    if(args.Length != 0) {
       if(Byte.TryParse(args[0], out maxSize))
         queue = new Queue(){MaxSize = maxSize};
       else
         return;
    } else {
       return;   
}

Por supuesto, solo puedes salirte con la tuya porque estás usando 0 como tu código de salida en todos los casos. Realmente, deberías devolver un int en lugar de usar Environment.Exit. Para este caso en particular, este sería mi método preferido

static int Main(string[] args) {
    if(args.Length != 0) {
       if(Byte.TryParse(args[0], out maxSize))
         queue = new Queue(){MaxSize = maxSize};
       else
         return 1;
    } else {
       return 2;
    }
}

Inicialice la cola a nulo, que en realidad es solo un truco del compilador que dice "Descubriré mis propias variables no inicializadas, muchas gracias". Es un truco útil, pero no me gusta en este caso: tienes demasiadas ramas para comprobar fácilmente que lo estás haciendo correctamente. Si realmente quisiera hacerlo de esta manera, algo como esto sería más claro:

static void Main(string[] args) {
  Byte maxSize;
  Queue queue = null;

  if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) {
     Environment.Exit(0);
  }
  queue = new Queue(){MaxSize = maxSize};

  for(Byte j = 0; j < queue.MaxSize; j++)
    queue.Insert(j);
  for(Byte j = 0; j < queue.MaxSize; j++)
    Console.WriteLine(queue.Remove());
}

Agregue una declaración de retorno después de Environment.Exit. Nuevamente, este es más un truco de compilación, pero es un poco más legítimo en mi opinión porque agrega semántica para los humanos también (aunque te mantendrá alejado de esa cobertura de código del 100%)

static void Main(String[] args) {
  if(args.Length != 0) {
     if(Byte.TryParse(args[0], out maxSize)) {
        queue = new Queue(){MaxSize = maxSize};
     } else {
        Environment.Exit(0);
        return;
     }
  } else { 
     Environment.Exit(0);
     return;
  }

  for(Byte j = 0; j < queue.MaxSize; j++)
     queue.Insert(j);
  for(Byte j = 0; j < queue.MaxSize; j++)
     Console.WriteLine(queue.Remove());
}

El compilador solo sabe que el código es o no es accesible si usa " return " ;. Piense en Environment.Exit () como una función a la que llama, y ??el compilador no sabe que cerrará la aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top