为什么“并非所有代码路径都返回一个值”,带有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; }