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

Mat*_*els 27 .net c# enums visual-studio-2008 c#-3.0

我有以下代码:

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
}
Run Code Online (Sandbox Code Playgroud)

我得到错误:"Not all code paths return a value".我不明白该switch声明如何不能跳转到指定的情况之一.

可以将enum某种方式null

Jon*_*eet 38

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

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

int x = Method((MyEnum) 127);
Run Code Online (Sandbox Code Playgroud)

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

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

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

样品:

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; 
}
Run Code Online (Sandbox Code Playgroud)

这假设底层值与您想要返回的值之间存在明显的关系MyEnum.


Nic*_*sen 5

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

MyEnum v = (MyEnum)1000;
Run Code Online (Sandbox Code Playgroud)

而且根本没有问题.为您的交换机添加默认值,您将处理所有可能的情况.