Почему ошибка «неназначенная локальная переменная» появляется в одной функции, но не во второй очень похожей функции - PullRequest
0 голосов
/ 28 мая 2020

поэтому я пытаюсь понять эту вещь, у меня есть две похожие функции

  1. Первая функция определяет, кто выиграет в игре с бумагой, ножницами или камнем, используя блоки if / else

  2. Вторая функция делает то же самое, но использует словари и ключи / значения

Проблема в том, что первая функция работает нормально, но во второй функции я получил ' Использование неназначенных local viarable 'ошибка, которую я знаю, чтобы исправить это, я должен изменить string win1; на string win1 = "";, но я не понимаю, почему

Код первой функции:

static string whowin(int x, int y)
{
    string win;
    if (x == 1)
    {
        if (y == 2)
        {
            win = "player2";
        }
        else if (y == 3)
        {
            win = "player1";
        }
        else
        {
            win = "draw";
        }
    }
    else if (x == 2)
    {
        if (y == 1)
        {
            win = "player1";
        }
        else if (y == 3)
        {
            win = "player2";
        }
        else
        {
            win = "draw";
        }
    }
    else // player 1 choose 3 - scissors
    {
        if (y == 2)
        {
            win = "player1";
        }
        else if (y == 1)
        {
            win = "player2";
        }
        else
        {
            win = "draw";
        }
    }
    return win;
}

и вторая функция:

static string whowin2(int x, int y)
{
    // x- player 1 input, y- player 2 input
    // 1 - rock, 2- paper, 3 = scissors
    Dictionary<int, int> player1win = new Dictionary<int, int>() {
        { 1, 3 },
        { 2, 1 },
        { 3, 2 }
        };
     Dictionary<int, int> player2win = new Dictionary<int, int>() {
        { 1, 2 },
        { 2, 3 },
        { 3, 1 }
           };

    string win1;

    if (player1win.ContainsKey(x) && player1win[x].Equals(y))
    {
        win1 = "player1";
    }
    else if (player2win.ContainsKey(x) && player2win[x].Equals(y))
    {
        win1 = "player2";
    }
    else if (x == y)
    {
        win1 = "draw";
    }
    else
    {
        Console.WriteLine("Cos cos sie popsuo");
    }
    return win1;
}

Ответы [ 3 ]

3 голосов
/ 28 мая 2020

Во втором методе существует путь выполнения, в котором переменная win1 не установлена:

string win1;

if (...)
    [...]
else if (...)
    [...]
else if (...)
    [...]
else
{
    Console.WriteLine("Cos cos sie popsuo");
    // HERE
}
return win1;

Когда вы вводите ветку else, ваша переменная win1 не будет установлена, так что это «неназначенный локальный жизнеспособный».

1 голос
/ 28 мая 2020

Последнее предложение else второй функции не устанавливает для win1 никакого значения. Затем вы пытаетесь вернуть значение win1, которое, как видит компилятор, не было инициализировано. Итак, вы правы, объявите win1 = String.Empty или "", и компилятор будет счастлив.

0 голосов
/ 28 мая 2020

Когда компилятор смотрит на ваш код, он видит, что он может попасть в последнее условие else, и в этом случае он вернет win1, если для него ничего не установлено, следовательно, используется неназначенный local. Если вы инициализируете при объявлении, вы устанавливаете переменную перед ее использованием.

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