Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “为什么?”;并非所有代码路径都返回一个值";使用switch语句和枚举?_C#_.net_Visual Studio 2008_C# 3.0_Enums - Fatal编程技术网

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;