【问题标题】:Why does this simple method not work?为什么这个简单的方法不起作用?
【发布时间】:2012-08-29 09:00:55
【问题描述】:

一定很简单,但我似乎找不到解释。为什么以下会产生这些错误:

  1. 检测到无法访问的代码(在 result++ 上)
  2. WindowsFormsApplication1.Form1.GetResult(int, int):并非所有代码路径都返回值

    private int GetResult(int start, int end)
    {
        for (int result = start; result < end; result++)
        {
            return result;
        } 
    }
    

谁能帮帮我?提前谢谢:)

编辑: 首先,感谢您的许多(快速)回复。我的愚蠢……但我没有看到它。

抱歉,我需要更准确地说明我想要接受的内容。 我需要一种方法,它从给定的起始值(int start)开始将一个值(结果)加 1,直到它达到另一个值(int end)。 因此,如果我没记错的话,它也可能直接添加到开始整数。并返回该值?

【问题讨论】:

  • 我还有一个问题。你想做什么?这段代码很奇怪o0
  • 修复后可以优化为private int GetResult(int start, int end){return start;}。这毫无意义,导致我们中的一些人怀疑这不是您真正想要的。
  • @John Hanna 你是对的,然后不需要调用该函数。他可以使用 just start 作为结果而不是调用方法:)
  • 我的猜测是他想返回一个数字序列。
  • (响应您的编辑)假设开始start 上加一直到start == end,然后返回start,相当于只返回end——只会更浪费.请记住(除非您传入一个可变对象或修改字段)当方法完成时,您没有 return 的任何内容都会被遗忘。

标签: c#


【解决方案1】:

因为你的方法返回一个int 类型,编译器无法确定你是否会进入循环。

如果result 大于或等于end 怎么办,在这种情况下,循环内的语句将不会执行,因此会出现错误。

来自MSDN - For Loop

因为条件表达式的测试发生在 执行循环时,for 语句会执行零次或多次。

这为您提供了错误“并非所有代码路径都返回值”背后的原因,因为如果 for 循环执行 0 次,则该方法将不会返回任何内容

对于警告“检测到无法访问的代码”,原因是您的更新表达式result++ 在执行for 块之后执行。由于您的 for 块包含 return 语句,因此您将永远无法达到更新表达式

【讨论】:

    【解决方案2】:

    多么聪明的编译器!

    for (int result = start; result < end; result++)
    {
        return result;
    } 
    

    ... 等价于:

    int result = start;
    while(result < end) {
      return result;
      result++;
    }
    

    如果在我们进入这段代码时 start >= end,while 循环的内容将永远不会运行。在这种情况下,程序流不会遇到return 语句:并非所有代码路径都返回值

    如果在我们进入函数时开始return语句,方法将返回。它不能命中@​​987654325@ 语句。 检测到无法访问的代码


    响应您的编辑:

    public int getResult(int start, int end) {
       int result = start;
       while(result < end) {
           result++;
       }
       return result;
    }
    

    ...按照您的描述进行。但是,获得该结果是一种浪费的方式。如果 start=0 和 end=1000000,程序将循环一百万次。

    你会更有效地得到完全相同的结果:

    public int getResult(int start, int end) {
       if(end > start) {
          return end;
       } else {
          return start;
       }
    }
    

    甚至:

    public int getResult(int start, int end) {
       return Math.Max(start,end);
    }
    

    (虽然还不清楚如果start &gt; end你想要的结果是什么)

    【讨论】:

      【解决方案3】:

      方法开头有两种不同的情况:

      • 案例start &lt; end:你总是立即返回result 第一个循环运行。因此result 永远不会增加。

      • 案例start &gt;= end:你永远不会进入循环,因此你需要 另一个return 声明。

      【讨论】:

        【解决方案4】:

        很明显result++是不可达的。如果有的话,您将在第一次执行循环后到达它 - 但在第一次执行循环时,您会返回,从而退出函数。

        关于问题的第二部分,请参阅Habib's answer

        【讨论】:

          【解决方案5】:
          private int GetResult(int start, int end)
          {
              int result = 0;
              for (result = start; result < end; result++)
              {
                  return result;
              } 
              return result;
          }
          

          这样函数应该可以工作。

          【讨论】:

          • 拜托 Forlan 你已经声明了两次
          • -1 没有解释,结果永远不会增加,所以方法没用。
          • 我们不知道预期的行为是什么。
          • @slim:我怀疑它是否打算总是返回start
          • @TimSchmelter 我们真的不知道预期的行为。 (Darum kannst du nicht sagen das sie nutzlos ist ;-))
          【解决方案6】:

          您正在调用 for 循环。 它设置 result=start 比较条件是否为真 然后返回结果。 它怎么会达到结果++? =检测到无法访问的代码(在结果++上)

          可能是结果>结束时循环永远不会进入所以 =并非所有代码路径都返回值

          【讨论】:

            【解决方案7】:

            让我们假设条件“结果

            如果有用请告诉我。

            一切顺利!!!

            【讨论】:

              【解决方案8】:

              如果你在 for 循环之后添加一个 return 语句,它将编译没有错误。

              【讨论】:

                【解决方案9】:
                private int GetResult(int start, int end)
                {
                    int result = 0;
                
                    for (result = start; result < end; result++)
                    {
                        return result;
                    } 
                    return result;
                
                }
                

                【讨论】:

                  【解决方案10】:

                  如果start &lt; end,此函数返回start,否则不返回任何内容。

                  你的方法的目的是什么?

                  【讨论】:

                    【解决方案11】:

                    让我们考虑一下您的条件 result &lt; end 失败的场景。所以控制 不会进入循环,会退出循环。但是外面没有 return 语句,所以它会返回什么,因为另一端期望一些整数是 return ,所以这就是你得到错误的原因。

                    这将起作用:-

                    private int GetResult(int start, int end)
                    {
                        for (int result = start; result < end; result++)
                        {
                            return result;
                        } 
                    return 0;
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      如果 start > end 值,循环内的代码将永远不会被执行,因此不会有任何东西从函数返回,因此你会得到这些错误。 此外,没有必要像你一样使用 for 循环,因为在第一步本身 if start

                      private int GetResult(int start, int end)
                      {   
                          if(start<end)
                             return start;
                          return -1;
                      }
                      

                      【讨论】:

                        【解决方案13】:

                        我不认为 forreturn 做你认为他们做的事。当我阅读您的代码时,它可能被简化为:

                        private int GetResult(int start, int end)
                        {
                            if (start < end)
                            {
                                return start;
                            }
                            else
                            {
                                return 0; // or another default for when start >= end
                            }
                        }
                        

                        因为return 会从方法返回。由于循环的第一次迭代(如果 start result,它已被设置为 start 的值。

                        如您的代码所示,else 部分缺失。因此,当 start >= end 时编译器不知道你想要返回什么,并且 result++ 因为你直接返回,所以永远不会被调用,所以它会抛出显示的错误和警告。

                        【讨论】:

                          【解决方案14】:

                          因为如果start >= end,就不会进入循环

                          private int GetResult(int start, int end)
                          {
                              for (int result = start; result < end; result++)
                              {
                                  return result;
                              } 
                              return -1; // Path here exists
                          }
                          

                          出于兴趣,如果您想返回startend 之间的每个整数,您应该查看yield return:

                              private IEnumerable<int> GetResult(int start, int end)
                              {
                                  for (int result = start; result < end; result++)
                                  {
                                      yield return result;
                                  }
                                  // Now we don't need a return, because the loop will eventually complete
                              }
                          

                          编辑看看 cmets,OP 可能想要一个数字序列。

                          上面的方法可以迭代

                          foreach (int anInt in GetResult(40, 50))
                          {
                              Console.WriteLine(string.Format("Next value is {0}", anInt));
                          }
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2011-10-25
                            • 2012-06-25
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多