我有以下代码:
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
吗?
答案 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;
}