Нельзя сказать, что значение 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
и значением, которое вы хотите вернуть.