返回枚举类型时,“并非所有代码路径都返回值”

时间:2010-05-24 00:33:40

标签: c# return-value enums

我有枚举列表和方法,我收到错误:“并非所有代码路径都返回值
有些想法在我的方法中有什么问题吗?我确信我总是返回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 个答案:

答案 0 :(得分:8)

如果满足条件,那么没有任何回报。您需要使用if...elseif...else 或者在所有if语句之后返回,如果没有返回任何值,则返回一个值(没有满足if条件)。

答案 1 :(得分:4)

也许您确定将始终给出返回类型,但编译器不是[想象所有if条件都失败 - 即:在您的代码由外部程序执行时,变量已更改。然后会发生什么?]

只需将底部的返回值作为“默认”值。如果你愿意,你也可以抛出异常,因为永远不会达到底部,对吧?

答案 2 :(得分:3)

这与您返回ENUM这一事实无关,而且与编译器检测到您从未使用任何值调用RETURN的情况有关。

您应该在函数底部添加一个返回默认值的返回语句。

答案 3 :(得分:3)

这是因为每个return语句前面都有一个if语句。因此,如果所有if语句都为false,则不会返回任何值。如果所有if语句都不可能为false,请删除if (gracze[id].IloscJedzenia <= 0),因为它是多余的。如果没有,请在末尾添加return null;或其他内容,否则会抛出错误。

答案 4 :(得分:3)

替换它:

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

将评论中的冗余行留作文档。

答案 5 :(得分:1)

编译器的静态分析(即用于检查此条件的代码)并不总是100%准确。但是当它不是100%准确时,编译器倾向于错误地给出误报(即,说它不会从所有路径返回)而不是假阴性(即说它不会从所有路径返回。)

所以在底部添加一个return,改为使用一系列“if ... else if else”语句,或者抛出一个异常来表示条件是“不可能的”。