Ошибка C #:Использование неназначенной локальной переменной

StackOverflow https://stackoverflow.com/questions/256073

  •  05-07-2019
  •  | 
  •  

Вопрос

Я не уверен, почему я получаю эту ошибку, но разве этот код не должен компилироваться, поскольку я уже проверяю, инициализируется ли очередь?

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

Итак, если очередь не инициализирована, то циклы for недоступны, верно?Поскольку программа уже завершается с помощью Environment.Exit(0)?

Надеюсь, вы сможете дать мне несколько советов :)

Спасибо.

Это было полезно?

Решение

Компилятор не знает, что Environment.Exit() собирается завершить программу;он просто видит, как вы выполняете статический метод в классе.Просто инициализируйте queue равняется нулю, когда вы его объявляете.

Queue queue = null;

Другие советы

Компилятор не знает, что Environment.Exit() не возвращает.Почему бы просто не "вернуть" из Main()?

Несколько различных способов решения проблемы:

Просто замените окружение.Завершите с возвратом.Компилятор знает, что return завершает метод, но не знает эту среду.Exit завершает.

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

Конечно, на самом деле вам это может сойти с рук только потому, что вы используете 0 в качестве кода выхода во всех случаях.Действительно, вы должны возвращать int вместо использования Environment.Exit.В данном конкретном случае это был бы мой предпочтительный метод

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

Инициализируйте очередь равным null, что на самом деле является просто трюком компилятора, который говорит: "Я разберусь со своими собственными неинициализированными переменными, большое вам спасибо".Это полезный трюк, но мне он не нравится в данном случае - у вас слишком много ветвей if, чтобы легко проверить, что вы делаете это правильно.Если вы действительно хотел сделать это таким образом, что-то вроде этого было бы понятнее:

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

Добавьте оператор return после Environment.Exit.Опять же, это скорее трюк компилятора - но немного более законный IMO, потому что он добавляет семантику и для людей (хотя это убережет вас от хваленого 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());
}

Компилятор знает только о том, доступен код или нет, если вы используете "return".Думайте об Environment.Exit() как о функции, которую вы вызываете, и компилятор не знает, что она закроет приложение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top