代码之家  ›  专栏  ›  技术社区  ›  Razor

此switch语句出现编译时错误

c#
  •  2
  • Razor  · 技术社区  · 15 年前

    我得到一个编译时错误

    返回一个值。

    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 回复  |  直到 15 年前
        1
  •  5
  •   John Saunders    15 年前

    根据“someOtherValue”的值,任何其他开关块都只会命中“break”语句。在切换之后没有return语句,因此任何命中“break”的情况都不会返回值。

        2
  •  5
  •   Jubal    15 年前

    我会修改它,这样就只有一个返回点,不管怎样,出于清楚的原因,我喜欢它。:-)

    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));
            }
        }
    }
    
        3
  •  1
  •   kemiller2002    15 年前

    在方法末尾需要一个return语句。我猜你希望它返回0。
    您已经在switch语句中设置了一些条件,这些条件可以防止switch语句命中每个语句中的return语句。

    case Foo.Bar:
                if (someOtherValue > 20)
                    return 1;
                break;
    

    test 等于 Foo.Bar someOtherValue <= 20 ,则永远不会到达此返回语句。所有当前的switch语句都是这样(除了默认语句)。即使业务逻辑设置为永远不会发生这种情况,编译器也不知道这一点,因此它会告诉您并非所有路径都返回值。

        4
  •  0
  •   Malcolm Haar    15 年前

    两件事:

    break switch 语句将退出,不返回任何值。

    2) 从概念上讲,你说 转换 语句应返回一个默认值0,该值为true,但要打开的变量为 test . 这个 语句将为任何值返回0 测试 未列出的,例如。 Foo.Park Foo.Library . 如果 语句匹配任何列出的值,例如。 Foo.Bar ,则只执行该块中的代码。这个 转换 然后将退出语句。