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标签都不匹配的常量值,并且不存在默认标签.
| 归档时间: |
|
| 查看次数: |
1224 次 |
| 最近记录: |