使用此switch语句编译时间错误

时间:2010-06-22 01:12:05

标签: c#

我收到编译时错误

'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;
    }
}

4 个答案:

答案 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.BarsomeOtherValue <= 20,则永远不会达到此返回语句。对于所有当前的switch语句(默认值除外)都是如此。即使业务逻辑设置为永远不会发生这种情况,编译器也不会知道,因此它会告诉您并非所有路径都返回值。

答案 3 :(得分:0)

2件事:

1)代码方面,如果执行任何break语句,则将退出switch语句,并且不返回任何值。

2)从概念上讲,你说switch语句应该返回默认值0,这是真的,但你要打开的变量是test。对于未列出的任何值switchtest语句将返回0,例如Foo.ParkFoo.Library。如果switch语句与列出的任何值匹配,例如Foo.Bar,然后只执行该块中的代码。然后将退出switch语句。