«не все пути кода возвращают значение» при возврате типа enum - PullRequest
0 голосов
/ 24 мая 2010

У меня есть список и метод enum, и я получаю ошибку: « не все пути кода возвращают значение »
Какая-то идея, что не так в моем методе? Я уверен, что всегда возвращаю тип STANY: /

Спасибо за помощь:)

     private enum STANY { PATROL, CHAT, EAT, SEARCH, DIE };

     private STANY giveState(int id, List<Ludek> gracze, List<int> plansza)
    {
        // Sprawdz czy gracz stoi na polu z jedzeniem i nie ma 2000 jednostek jedzenia
        bool onTheFood = false;
        onTheFood = CzyPoleZjedzeniem(id, gracze, plansza, onTheFood);

        if (onTheFood && (gracze[id].IloscJedzenia < startFood / 2))
            return STANY.EAT;

        // Sprawdz czy gracz nie stoi na polu z innym graczem
        bool allKnowledge = true;
        allKnowledge = CzyPoleZInnymGraczem(id, gracze, allKnowledge);

        if (!allKnowledge)
            return STANY.CHAT;

        // Jesli ma ponad i rowna ilosc jedzenia patroluj
        if (gracze[id].IloscJedzenia >= startFood / 2)
            return STANY.PATROL;

        // Jesli ma mniej niz polowe jedzenia szukaj jedzenia
        if (gracze[id].IloscJedzenia > 0 && gracze[id].IloscJedzenia < startFood / 2)
            return STANY.SEARCH;

        // Jesli nie ma jedzenia umieraj
        if (gracze[id].IloscJedzenia <= 0)
            return STANY.DIE;
    }

Ответы [ 6 ]

8 голосов
/ 24 мая 2010

возврата нет, если не выполнено ни одно из этих условий. Вам нужно либо использовать if...elseif...else или иметь возврат после всех операторов if, которые будут возвращать значение, если ничего не возвращено (ни одно из условий if не было выполнено).

4 голосов
/ 24 мая 2010

Может быть, вы уверены, что тип возвращаемого значения всегда будет указан, но компилятор не [представьте, что все условия if не выполняются, т.е. переменная была изменена во время выполнения вашего кода внешней программой. Тогда что будет?]

Просто вставьте возврат внизу как значение по умолчанию. Вы также можете выбросить исключение, если хотите, так как дно никогда не должно быть достигнуто, верно?

3 голосов
/ 24 мая 2010

Заменить это:

// Jesli nie ma jedzenia umieraj
if (gracze[id].IloscJedzenia <= 0)
    return STANY.DIE;

С этим:

// Jesli nie ma jedzenia umieraj
// (gracze[id].IloscJedzenia <= 0)
return STANY.DIE;

Оставьте лишнюю строку в комментарии как документацию.

3 голосов
/ 24 мая 2010

Это потому, что каждому оператору return предшествует оператор if.Поэтому, если все ваши операторы if ложны, никакое значение не будет возвращено.Если невозможно, чтобы все операторы if были ложными, удалите if (gracze[id].IloscJedzenia <= 0), так как это избыточно.Если нет, то добавьте return null; или что-то в конце или выведите ошибку.

3 голосов
/ 24 мая 2010

Это не имеет ничего общего с тем, что вы возвращаете ENUM, и все, что связано с тем, что компилятор обнаруживает, что есть случаи, когда вы никогда не вызываете RETURN с каким-либо значением.

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

1 голос
/ 24 мая 2010

Статический анализ компилятора (т. Е. Код, предназначенный для проверки этого условия) не всегда на 100% точен. Но когда он не на 100% точен, компилятор будет склонен ошибаться, давая ложный положительный результат (то есть говоря, что он не возвращается со всех путей), чем ложный отрицательный (то есть не говоря, что это не возвращается из всех путей).

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

...