为什么在以下代码中为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
没有其他选项吗?
答案 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标签都不匹配的常量值,并且不存在默认标签。