为什么“并非所有代码路径都返回一个值”,带有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
语句怎么不能跳转到指定的情况之一。
enum
可以以某种方式为null
吗?
没有什么可说的, myEnum
的值将是其中一个值。
不要将枚举误认为是一组限制性的值。 它实际上只是一组命名的值。 例如,我可以用以下方法调用您的方法:
int x = Method((MyEnum) 127);
你想要做什么? 如果您希望它抛出exception,您可以在默认情况下执行此操作:
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, eg by adding 1 or whatever return (int) myEnum; }
这假设MyEnum
的基础值与您想要返回的值之间存在明显的关系。
枚举不限于它们所代表的值。 您可以指定:
MyEnum v = (MyEnum)1000;
而且根本没有问题。 为您的交换机添加默认设置,您将处理所有可能的情况。
如果更改枚举中的值(添加第四个),代码将会中断。 您应该在switch语句中添加default: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; }