我有枚举列表和方法,我收到错误:“并非所有代码路径都返回值”
有些想法在我的方法中有什么问题吗?我确信我总是返回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;
}
答案 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”语句,或者抛出一个异常来表示条件是“不可能的”。