为什么“并非所有代码路径都返回一个值”,带有switch语句和枚举?

时间:2010-01-15 12:20:00

标签: c# .net visual-studio-2008 c#-3.0 enums

我有以下代码:

public int Method(MyEnum myEnum)
{
    switch (myEnum)
    {
        case MyEnum.Value1: return 1;
        case MyEnum.Value2: return 2;
        case MyEnum.Value3: return 3;
    }
}

public enum MyEnum
{
    Value1,
    Value2,
    Value3
}

我收到错误:"Not all code paths return a value"。我不明白switch语句怎么不能跳转到指定的一个案例。

enum某种程度上可以null吗?

5 个答案:

答案 0 :(得分:37)

没有什么可以说myEnum的价值就是这些价值之一。

不要将枚举误认为是限制性值集。它实际上只是一个名为的值集。例如,我可以用以下方法调用您的方法:

int x = Method((MyEnum) 127);

你想要做什么?如果您希望它抛出异常,您可以在默认情况下执行此操作:

switch (myEnum)
{
    case MyEnum.Value1: return 1;
    case MyEnum.Value2: return 2;
    case MyEnum.Value3: return 3;
    default: throw new ArgumentOutOfRangeException();
}

或者,如果您想在switch语句之前执行其他工作,则可以预先使用Enum.IsDefined。这有拳击的缺点...有一些方法,但它们通常更多的工作......

样品:

public int Method(MyEnum myEnum)
{
    if (!IsDefined(typeof(MyEnum), myEnum)
    {
        throw new ArgumentOutOfRangeException(...);
    }
    // Adjust as necessary, e.g. by adding 1 or whatever
    return (int) myEnum; 
}

这假设MyEnum中的基础值与您想要返回的值之间存在明显的关系。

答案 1 :(得分:5)

枚举不仅限于它们所代表的值。您可以指定:

MyEnum v = (MyEnum)1000;

根本没问题。为您的交换机添加默认设置,您将处理所有可能的情况。

答案 2 :(得分:0)

如果更改枚举中的值(添加第四个),则代码将中断。您应该在switch语句中添加default:case。

当然,实现此目的的另一种方法是在枚举中定义整数值...

public enum MyEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}

然后将您的枚举转换为代码中的int。您可以使用int myInt = Method(myEnumValue);

而不是int myInt = (int)myEnum

答案 3 :(得分:0)

MyEnum blah = 0;

默认值始终为0,并且可以隐式转换,即使您没有值为0的值。

答案 4 :(得分:-1)

必须是:

public int Method(MyEnum myEnum)
{
    switch (myEnum)
    {
        case MyEnum.Value1: return 1;
        case MyEnum.Value2: return 2;
        case MyEnum.Value3: return 3;
        default: return 0;
    }
}

或:

public int Method(MyEnum myEnum)
{
    switch (myEnum)
    {
        case MyEnum.Value1: return 1;
        case MyEnum.Value2: return 2;
        case MyEnum.Value3: return 3;
    }

    return 0;
}