我收到编译时错误
'UserQuery.ReturnInt(UserQuery.Foo)':并非所有代码路径都返回值
除非我在代码中没有看到某些内容,否则switch语句应返回0作为默认值,以便所有代码路径 do 返回一个值。
enum Foo
{
Bar,
Zoo,
Boo
}
void Main()
{
Foo test = Foo.Bar;
Console.WriteLine (ReturnInt(test));
}
int ReturnInt(Foo test) {
int someOtherValue = 4; // <---Value may change depending on X
switch (test)
{
case Foo.Bar:
if (someOtherValue > 20)
return 1;
break;
case Foo.Zoo:
if (someOtherValue == 5)
return 4;
break;
case Foo.Boo:
if (someOtherValue == 2)
return 7;
break;
default:
return 0;
}
}
答案 0 :(得分:6)
根据“someOtherValue”的值,任何其他开关块都会点击“break”语句。切换后没有返回语句,因此任何触发“break”的情况都不会返回值。
答案 1 :(得分:5)
我会改变它,以便只有一个返回点,无论如何我都喜欢这个返回点。 : - )
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static int ReturnInt(Foo test)
{
int retVal = 0; // defaults to 0
int someOtherValue = 4; // <---Value may change depending on X
switch (test)
{
case Foo.Bar:
if (someOtherValue > 20)
retVal = 1;
break;
case Foo.Zoo:
if (someOtherValue == 5)
retVal = 4;
break;
case Foo.Boo:
if (someOtherValue == 2)
retVal = 7;
break;
default:
retVal = 0;
break;
}
return retVal;
}
enum Foo
{
Bar,
Zoo,
Boo
}
static void Main(string[] args)
{
Foo test = Foo.Bar;
Console.WriteLine(ReturnInt(test));
}
}
}
答案 2 :(得分:1)
您需要在end方法中使用return语句。我的猜测是你希望它返回0 您已在switch语句中设置条件,以防止它访问每个语句中的return语句。
case Foo.Bar:
if (someOtherValue > 20)
return 1;
break;
在此语句中test
等于Foo.Bar
和someOtherValue <= 20
,则永远不会达到此返回语句。对于所有当前的switch语句(默认值除外)都是如此。即使业务逻辑设置为永远不会发生这种情况,编译器也不会知道,因此它会告诉您并非所有路径都返回值。
答案 3 :(得分:0)
2件事:
1)代码方面,如果执行任何break
语句,则将退出switch
语句,并且不返回任何值。
2)从概念上讲,你说switch
语句应该返回默认值0,这是真的,但你要打开的变量是test
。对于未列出的任何值switch
,test
语句将返回0,例如Foo.Park
或Foo.Library
。如果switch
语句与列出的任何值匹配,例如Foo.Bar
,然后只执行该块中的代码。然后将退出switch
语句。