C# “为什么?”;并非所有代码路径都返回一个值";使用switch语句和枚举?
我有以下代码:C# “为什么?”;并非所有代码路径都返回一个值";使用switch语句和枚举?,c#,.net,visual-studio-2008,c#-3.0,enums,C#,.net,Visual Studio 2008,C# 3.0,Enums,我有以下代码: 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 }
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
}
我得到一个错误:“不是所有的代码路径都返回一个值”
。我不明白switch
语句怎么会跳到指定的情况之一
enum
是否会以某种方式变为null
?如果更改枚举中的值(添加第四个),代码将中断。您应该在switch语句中添加一个default:case
当然,实现这一点的另一种方法是在枚举中定义整数值
public enum MyEnum
{
Value1 = 1,
Value2 = 2,
Value3 = 3
}
然后在代码中将枚举强制转换为int。而不是
int myInt=Method(myEnumValue)
您可以使用int myInt=(int)myEnum
没有什么可以说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
中的基础值与要返回的值之间存在明显的关系。枚举不限于它们所表示的值。您可以分配以下内容:
MyEnum v = (MyEnum)1000;
这样就不会有任何问题了。将默认值添加到交换机,您将处理所有可能的情况。它必须是:
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;
}
}
或:
默认值始终为0,并且可以隐式转换,即使您没有一个值为0的值。或者,如果枚举不是有效值,或者他希望的任何其他处理情况,您可以引发异常。如果我更改代码,代码会断开,这不是编译器的业务,对吗?不是直接的,不是,但是如果你把我的答案扩展到下面列出的其他答案,你就会看到这个问题。底线->向代码中添加默认大小写。正如我所希望的那样,添加枚举值确实会破坏我的代码,但事实并非如此。要回应Fax所说的,如果我向枚举中添加值,而不向基于该枚举的开关中添加大小写,我希望我的代码无法编译。@JonSkeet:你能举出一个例子,说明在这种情况下如何避免装箱吗?提前谢谢。@RaheelKhan:请看一个例子。为了防止任何人被误导,请注意Jon关于“使用
Enum.IsDefined
upfront”的替代建议不会消除编译错误;尽管编译器原则上应该能够指出,只要定义了IsDefined
检入,就可以完全覆盖所有可能的枚举值,但实际上这样做还不够聪明。尽管如此,由于类似的聪明的编译器技巧最近开始得到实现——就像TypeScript的typeguards一样——也许我们会看到编译器在几年内变得足够聪明,能够解决这个问题。@MarkAmery:通过调用Enum.IsDefined
,您可以在之后强制转换,“我不明白你的回答,可能是因为我是个大傻瓜,刚刚在C#中找到了自己的脚。”。将什么转换为什么,如何避免切换/案例myEnum
已经是类型myEnum
,那么强制转换如何可能有帮助呢?也许在你的答案中加入一个你建议的例子会有所帮助,或者也许我只是太笨了。
public int Method(MyEnum myEnum)
{
switch (myEnum)
{
case MyEnum.Value1: return 1;
case MyEnum.Value2: return 2;
case MyEnum.Value3: return 3;
}
return 0;
}
MyEnum blah = 0;