Pergunta

Eu não tenho certeza por isso que eu estou recebendo este erro, mas não deve esta compilação de código, desde que eu já estou verificando para ver se a fila está sendo inicializado?

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());
}

Então, se fila não é inicializado, então o para loops não estão bem acessível? Desde que o programa já termina com Environment.Exit (0)?

Hope ya pode me dar algumas dicas:)

Graças.

Foi útil?

Solução

O compilador não sabe que o Environment.Exit () vai terminar o programa; ele só vê você executar um método estático em uma classe. queue apenas initialize como nulo quando você declará-lo.

Queue queue = null;

Outras dicas

O compilador não sabe que Environment.Exit () não retorna. Porque não basta "retorno" de Main ()?

Um par de maneiras diferentes para resolver o problema:

Basta substituir Environment.Exit com retorno. O compilador sabe que o retorno termina o método, mas não sabe que Environment.Exit faz.

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;   
}

Claro, você só pode realmente ir longe com isso porque você está usando 0 como seu código de saída em todos os casos. Realmente, você deve retornar um int em vez de usar Environment.Exit. Para este caso particular, este seria o meu 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;
    }
}

Inicializar fila para null, que é realmente apenas um truque do compilador que diz "eu vou descobrir minhas próprias variáveis ??não inicializadas, muito obrigado". É um truque útil, mas eu não gosto neste caso - você tem muitos se ramos para verificar facilmente que você está fazendo isso corretamente. Se você realmente queria fazê-lo desta forma, algo como isso seria mais 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());
}

Adicionar uma instrução de retorno após Environment.Exit. Mais uma vez, este é mais um truque do compilador - mas é um pouco mais legítimo IMO porque acrescenta semântica para os seres humanos, bem como (embora ele vai mantê-lo de que a cobertura de código alardeada 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());
}

O compilador só sabe que o código é ou não é alcançável se você usar o "retorno". Pense Environment.Exit () como uma função que você chama, e o compilador não sabe que ele vai fechar o aplicativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top