Почему" не все пути кода возвращают значение " с помощью оператора switch и перечисления?

у меня есть следующий код:

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 оператор может никогда не перейти к одному из указанных случаев.

Can an enum как-то null?

5 ответов


нет ничего, чтобы сказать, что значение 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();
}

в качестве альтернативы вы можете использовать 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; 
}

это предполагает, что есть очевидно связь между базовыми значениями в MyEnum и значение, которое вы хотите вернуть.


перечислений не ограничиваются значениями, которые они представляют. Вы можете назначить это:

MyEnum v = (MyEnum)1000;

и не было бы никаких проблем вообще. Добавьте значение по умолчанию к коммутатору, и вы будете обрабатывать все возможные ситуации.


Если вы измените значения в своем перечислении (добавив четвертый), ваш код сломается. В оператор switch следует добавить значение по умолчанию: case.

конечно, другой способ достичь этого - определить целочисленные значения в вашем перечислении...

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

а затем приведите свое перечисление как int в коде. Вместо int myInt = Method(myEnumValue); можно использовать int myInt = (int)myEnum


MyEnum blah = 0;

по умолчанию всегда 0 и неявно конвертируется, даже если у вас нет одного со значением 0.


это должно быть либо:

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