详尽切换的编译器错误

bav*_*aza 13 c# enums switch-statement

为什么我在下面的代码中得到" 并非所有代码路径返回值 " VeryBoolToBool()

public enum VeryBool { VeryTrue, VeryFalse };
public bool VeryBoolToBool(VeryBool veryBool)
{
    switch(veryBool)
    {
        case VeryBool.VeryTrue:
            return true;

        case VeryBool.VeryFalse:
            return false;

        // Un-commenting the unreachable(?) default clause will solve this
        // default:
        //    throw new HowTheHellDidIGetHereException();
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器不能看到没有其他选项VeryBool吗?

Jon*_*eet 16

编译器不能看到VeryBool没有其他选项吗?

不,因为有.例如,我可以打电话:

VeryBoolToBool((VeryBool) 5);
Run Code Online (Sandbox Code Playgroud)

C#中的枚举不是有限的值集.它们是有效命名的数字,具有额外的编译时类型安全性,因为枚举之间或枚举和数字之间没有隐式转换.(虽然有明确的转换.)然而,显式转换并不能确保有问题的值是带有名称的值.

除此之外,switch在C#中,从不检查是否明确列出了该类型的所有可能值.除非出现一种default情况(并且所有情况都终止),否则switch语句的结尾始终被视为"可达" .更确切地说,从C#5规范的第8.7.2节末尾开始:

如果至少满足下列条件之一,则可以访问switch语句的结束点:

  • switch语句包含一个可到达的break语句,它退出switch语句.
  • switch语句是可访问的,switch表达式是非常量值,并且不存在默认标签.
  • switch语句是可访问的,switch表达式是一个与任何case标签都不匹配的常量值,并且不存在默认标签.

  • @bavaza:有时,枚举的行为对于像这样有用-但在其他情况下却并非如此。我希望.NET中有一个“严格的枚举”类型,但是目前,我们需要使用我们拥有的:( (3认同)