为什么这个简单的方法不起作用?

时间:2012-08-29 09:00:55

标签: c#

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

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

    private int GetResult(int start, int end)
    {
        for (int result = start; result < end; result++)
        {
            return result;
        } 
    }
    
  3. 任何可以帮助我的人? Thnx提前:))

    修改 首先,感谢许多(快速)回复。我的愚蠢...但我没有看到它。

    对不起,我需要更准确地说明我想要提供什么...... 我需要一个方法,从给定的起始值(int start)开始,将值1(结果)加1,直到达到另一个值(int end)。 因此,如果我没有误会,它也可能直接添加到起始整数。并返回该值?

14 个答案:

答案 0 :(得分:11)

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

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

来自MSDN - For Loop

  

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

这给出了错误背后的原因“并非所有代码路径都返回一个值”,因为如果for循环执行0次,那么该方法将不返回任何内容

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

答案 1 :(得分:4)

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

  • 案例start < end:您始终会立即返回result 第一次循环运行。因此result永远不会增加。

  • 案例start >= end:您永远不会进入循环,因此您需要

  • 之外的另一个return声明

答案 2 :(得分:4)

显然result++无法访问。你可以在第一次执行循环后到达它 - 如果有的话 - 但是在第一次执行循环时,你返回,从而退出函数。

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

答案 3 :(得分:4)

多么聪明的编译器!

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

......相当于:

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

如果我们进入此代码时开始&gt; =结束,则while循环的内容将永远不会运行。在这种情况下,程序流不会出现return语句:并非所有代码路径都返回值

如果开始&lt;当我们进入函数时结束,程序流将进入循环,点击return语句,方法将返回。它无法点击result++语句。 检测到无法访问的代码


回复您的修改:

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 > end

仍然不清楚你想要的结果

答案 4 :(得分:2)

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

这样功能就可以了。

答案 5 :(得分:2)

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

可能是因为结果&gt;循环永远不会进入结束了 =并非所有代码路径都返回值

答案 6 :(得分:1)

假设条件“result&lt; end”为真。然后控件将进入循环内的语句。由于它是一个return语句,因此控制将来自函数/方法GetResult。因此,控件永远不会达到“结果++”。这就是为什么你得到 - 无法访问的代码。

如果它有用,请告诉我。

一切顺利!!!

答案 7 :(得分:0)

因为如果开始&gt; =结束,则不会输入循环

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

出于兴趣,如果你想要返回startend之间的每个整数,你应该看看收益率回报:

    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
    }

编辑查看评论,OP可能需要一系列数字。

可以迭代上述方法

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

private int GetResult(int start, int end)
{
    int result = 0;

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

}

答案 10 :(得分:0)

如果start,此函数返回start < end,否则它不会返回任何内容。

你的方法意图是什么?

答案 11 :(得分:0)

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

这将起作用: -

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

答案 12 :(得分:0)

如果开始&gt;结束值,循环中的代码永远不会被执行,因此不会有任何东西从函数返回,因此你会得到这些错误。 此外,没有必要使用for循环,因为在第一步本身,如果开始

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

答案 13 :(得分:0)

我不认为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&lt; end)将立即返回resultstart已设置为else的值。

如您的代码所示,{{1}}部分缺失。因此,编译器在启动&gt; = end时不知道你想要返回什么,并且因为你直接返回而且从未调用结果++,所以它会抛出错误和警告。