【问题标题】:" not all code paths return a value" when return enum type返回枚举类型时“并非所有代码路径都返回值”
【发布时间】:2010-05-24 00:33:40
【问题描述】:

我有枚举列表和方法,但出现错误:“并非所有代码路径都返回值
一些想法我的方法有什么问题?我确定我总是返回 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;
    }

【问题讨论】:

    标签: c# return-value enums


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      也许你确定总是会给出一个返回类型,但编译器并不是[想象一下所有的 if 条件都失败了——即:当你的代码被外部程序执行时,一个变量被改变了。那么会发生什么呢?]

      只需在底部添加一个返回作为“默认”值。如果你愿意,你也可以抛出异常,因为永远不应该到达底部,对吧?

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 如果您查看他的最后三个条件,它们在技术上是相互排斥的:其中 一个 必须为真。我认为这只是编译器的静态分析没有接受它(不是我期望它,真的......)
        • 这一切都取决于id的值
        • @RobS:什么? @codeka 是正确的,逻辑上最后三个​​条件之一必须为真。
        • @egrunin 如果 id 超出列表范围会发生什么?
        • @RobS:它将在gracze[id].IloscJedzenia 的第一个实例中抛出异常。不影响@codeka 的观点。
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          替换这个:

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

          将注释中多余的行留作文档。

          【讨论】:

            【解决方案6】:

            编译器的静态分析(即旨在检查这种情况的代码)并不总是 100% 准确。但是当它不是 100% 准确时,编译器会倾向于错误地给出误报(也就是说,它不会从所有路径返回)而不是误报(也就是说,not em> 说它不会从所有路径返回)。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-12-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-11-08
              相关资源
              最近更新 更多