详尽切换的编译器错误

时间:2013-12-24 10:17:14

标签: 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();
    }
}

编译器无法看到VeryBool没有其他选项吗?

1 个答案:

答案 0 :(得分:14)

  

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

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

VeryBoolToBool((VeryBool) 5);

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

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

  

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

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