Почему" не все пути кода возвращают значение " с помощью оператора 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;
}