Использование присвоенной нам локальной переменной, но переменная назначена - PullRequest
1 голос
/ 22 апреля 2020

Я работаю над небольшим проектом в c# в формах (Visual Studio), и у меня возникла проблема.

У меня есть следующий код в моих формах.cs:

private void Dierbutton_Click(object sender, EventArgs e)
{
    string name = AnimalNameTextbox.Text;
    bool fleshEater = CarnivoorCheckbox.Checked;
    Animal.Sizes size;


    if (AnimalSizeBig.Checked)
    {
        size = Animal.Sizes.Big;
    }
    else if (AnimalCheckboxMedium.Checked)
    {
        size = Animal.Sizes.Medium;
    }
    else if (AnimalCheckboxSmall.Checked)
    {
        size = Animal.Sizes.Small;
    }
    else
    {
        MessageBox.Show("Vul een grootte in!");
    }

    Animal newAnimal = new Animal(size, fleshEater, name);

    allAnimals.Add(newAnimal);
    DierListbox.Items.Add(newAnimal.Name);

}

И следующий код в моем классе Animal.cs:

namespace Circustrein_algoritmic
{
    public class Animal
    {
       public enum Sizes
        {
            None = 0,
            Small = 1,
            Medium = 3,
            Big = 5
        }
        public Sizes Size;
        public bool Flesheater { get; set; }
        public string Name { get; set; }


        /// <param name="size">Size</param>
        /// <param name="flesheater">True of flase wanneer dier vleeseter is</param>
        /// <param name="name">Name</param>

        public Animal(Sizes size, bool flesheater, string name)
        {
            Size = size;
            Flesheater = flesheater;
            Name = name;
        }


        public string getType()
        {
            return Flesheater ? "Flesheater" : "Planteater";
        }


    }
}

Я получаю сообщение об ошибке "использование неназначенной локальной переменной" size "" в этом фрагменте кода в forms.cs

Animal newAnimal = new Animal(size, fleshEater, name);

Но когда я изменяю код на это:

Animal newAnimal = new Animal(Animal.Sizes.Big, fleshEater, name);

Ошибка изменится на следующее предупреждение: «Переменная 'size' назначена, но ее значение никогда не используется.

Так что это назначено, но это не одновременно ???? Я не хочу менять код на это:

Animal newAnimal = new Animal(Animal.Sizes.Big, fleshEater, name);

Потому что я не хочу, чтобы мой размер быть прикрепленным к большому, среднему, малому или нулевому. Я понятия не имею, что делать. У кого-нибудь есть какие-либо советы? Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 22 апреля 2020

Так что это назначено, но не одновременно ????

Я понимаю, что эти сообщения компилятора сбивают с толку, и извиняюсь за это.

Сообщения об ошибках, которые имеют отношение к определенному назначению, и предупреждения, которые идентифицируют, возможно, неправильный код, были добавлены по частям, со временем и без solid плана, чтобы поддерживать их согласованность.

Когда я был в команде компиляторов, я сделал несколько попыток сделать их более последовательными и понятными, но эта работа, по меньшей мере, имела смешанный успех. Подробное изложение всех этих попыток приведет нас далеко; Я написал несколько статей и ответов о них в прошлом; один из них, который может вас заинтересовать, это эта серия из трех частей .

Простое объяснение состоит в том, что ошибка и предупреждение используют «назначенный» для обозначения двух разных вещей. Сообщение об ошибке:

use of unassigned local variable 'size'

, но это не совсем верно. Он должен сказать что-то вроде «локальной переменной size определенно не присваивается значение во всех возможных потоках управления до ее чтения».

Если вы посмотрите на свой код, то увидите, что если взята окончательная else, то size никогда не записывается, но по этому пути к коду она все равно читается , и это ошибка. Там нет значения для чтения!

Затем вы удаляете read , и ошибка исчезает, потому что сбой при инициализации переменной, которая никогда не читается, не является ошибкой . Тем не менее, код теперь выглядит неправильно; вы работали до пытались инициализировать size, а затем никогда не использовали эту работу, так что это, вероятно, ошибка. Предупреждение:

The variable 'size' is assigned but its value is never used.

Использует «назначенное» для значения »в какой-то момент в этом методе вы присвоили значение этой локальной переменной, но затем вы никогда не читали из нее, так почему вы присвоили это значение ? "

Это предупреждение встречается не так часто; компилятор обычно подавляет это. Почему? Поскольку этот шаблон чрезвычайно распространен:

int dummy = Blah(); 
// Note, dummy is never read, but I want to observe it in the debugger.

Но в вашем коде компилятор знает, что вы, вероятно, не используете size для целей отладки; вы только присвоили ей константы . Здесь нет никакой тайны о том, какова ее ценность; Вы можете просто прочитать код и узнать, какое его точное значение будет в каждом потоке управления.

Так вот в чем разница: в ошибке «неназначенный» означает «не определенно назначен в каждом потоке управления» и в предупреждение, «назначенный» означает «назначенный хотя бы один раз».

Понятия не имею, что делать.

Существует два способа продолжить.

Первый метод: сохранить назначения одинаковыми, но избегать пути к коду, в котором отсутствует назначение во время чтения. Например:

else
{
    MessageBox.Show("Vul een grootte in!");
    return;
}

Теперь нет проблем; единственный путь, по которому size не назначен возвращается до того, как size прочитано .

Второй метод: Добавить назначение по всем путям:

else
{
    MessageBox.Show("Vul een grootte in!");
    size = Animal.Sizes.None;
}

Теперь на каждом пути перед чтением есть назначение.

5 голосов
/ 22 апреля 2020

Если вы нажмете на оператор else, никакое значение не будет присвоено size; отсюда ошибка компиляции.

Либо инициализируйте переменную при объявлении, либо присвойте значение в блоке else.

1 голос
/ 22 апреля 2020

В дополнение к тому, что опубликовали другие, я хотел бы отметить, что ошибка переключения на «размер назначен, но никогда не используется» не совсем конфликт / противоположность «использования неназначенного» - если вы сидите там, царапая свою голову и сказать: «Прими решение - назначено это или нет ?!» затем вы можете посмотреть другие ответы для подробностей о первой ошибке:

  • «использование неназначенного» означает, что в вашем коде есть несколько возможных путей, которым эта переменная не может быть присвоена значение до его использования "; Вы можете прочитать много технической информации по этому вопросу, прибегая к помощи «c# определенное назначение»

  • и вторая ошибка - «назначенный, но никогда не используемый» в основном означает, что «размер только появляется когда-либо» с левой стороны от "=", поэтому он обнаруживает, что вы присваиваете ему значение, но тогда вы фактически никогда не используете его

Как вы можете себе представить, они не находятся в конфликте - возможна ситуация, когда вы используете переменную, которая может не иметь значения, и если вы уберете это использование, у вас останутся только пути кода, которые присваивают значение, но не используют он

1 голос
/ 22 апреля 2020

Хорошо, поэтому причина, по которой он говорит «использование неназначенной переменной», заключается в том, что есть путь через код, который он может принять (в вашем первом фрагменте кода), где он может не быть назначен - это происходит, если он попадает ваш последний блок if (где вы печатаете сообщение).

Вы можете исправить это, либо присвоив size значение внутри части THAT метода, либо вы можете вставить «return» после MessageBox.show, чтобы он просто выпал из метода при этом. указать, не создавая вообще «Животное» (и, следовательно, не передавая неинициализированный размер).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...