2

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

  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,直到它达到另一个值(打算)。因此,如果我没记错的话,它也可能直接添加到开始整数。并返回该值?

4

14 回答 14

11

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

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

来自MSDN - For 循环

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

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

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

于 2012-08-29T09:01:59.470 回答
4

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

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

  • 案例start >= end:您永远不会进入循环,因此您需要return在它之外再添加一条语句。

于 2012-08-29T09:03:16.470 回答
4

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

对于问题的第二部分,请参阅Habib 的回答

于 2012-08-29T09:04:14.800 回答
4

多么聪明的编译器!

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

... 相当于:

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

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

如果在我们进入函数时 start < end ,程序流程将进入循环,点击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);
}

(虽然仍然不清楚你想要的结果是什么 if start > end

于 2012-08-29T09:07:32.357 回答
2
private int GetResult(int start, int end)
{
    int result = 0;
    for (result = start; result < end; result++)
    {
        return result;
    } 
    return result;
}

这样该功能应该可以工作。

于 2012-08-29T09:03:07.423 回答
2

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

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

于 2012-08-29T09:04:22.973 回答
1

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

让我知道,如果它有用。

祝一切顺利 !!!

于 2012-08-29T09:12:07.633 回答
0

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

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

出于兴趣,如果您想返回 and 之间的每个整数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
    }

编辑查看评论,OP很可能想要一个数字序列。

上面的方法可以迭代

foreach (int anInt in GetResult(40, 50))
{
    Console.WriteLine(string.Format("Next value is {0}", anInt));
}
于 2012-08-29T09:03:31.457 回答
0

如果在 for 循环之后添加 return 语句,它将编译而不会出错。

于 2012-08-29T09:03:52.923 回答
0
private int GetResult(int start, int end)
{
    int result = 0;

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

}
于 2012-08-29T09:04:08.903 回答
0

此函数返回startif start < end,否则不返回任何内容。

你的方法的目的是什么?

于 2012-08-29T09:04:46.483 回答
0

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

这将起作用:-

private int GetResult(int start, int end)
{
    for (int result = start; result < end; result++)
    {
        return result;
    } 
return 0;
}
于 2012-08-29T09:05:56.260 回答
0

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

private int GetResult(int start, int end)
{   
    if(start<end)
       return start;
    return -1;
}
于 2012-08-29T09:06:20.800 回答
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 < end)将立即返回result,它已设置为 的值start

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

于 2012-08-29T09:06:23.873 回答