一定很简单,但我似乎无法找到解释。为什么以下会产生这些错误:
WindowsFormsApplication1.Form1.GetResult(int,int):并非所有代码路径都返回值
private int GetResult(int start, int end)
{
for (int result = start; result < end; result++)
{
return result;
}
}
任何可以帮助我的人? Thnx提前:))
修改 首先,感谢许多(快速)回复。我的愚蠢...但我没有看到它。
对不起,我需要更准确地说明我想要提供什么...... 我需要一个方法,从给定的起始值(int start)开始,将值1(结果)加1,直到达到另一个值(int end)。 因此,如果我没有误会,它也可能直接添加到起始整数。并返回该值?
答案 0 :(得分:11)
因为您的方法返回int
类型,并且编译器无法确定您是否会进入循环。
如果result
大于或等于end
怎么办?在这种情况下,循环内的语句将不会执行,因此您会收到错误。
因为条件表达式的测试发生在之前 执行循环时,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
}
出于兴趣,如果你想要返回start
和end
之间的每个整数,你应该看看收益率回报:
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)
我不认为for
和return
做你认为他们做的事情。在我阅读你的代码时,可能会对此愚蠢:
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)将立即返回result
,start
已设置为else
的值。
如您的代码所示,{{1}}部分缺失。因此,编译器在启动&gt; = end时不知道你想要返回什么,并且因为你直接返回而且从未调用结果++,所以它会抛出错误和警告。