我很清楚 C# 不允许 switch
block 中的 readonly
字段,这就是 this question地址。
我想了解为什么是这种情况。这只是一个任意的语言规范怪癖,还是背后有技术原因?如果是,技术原因是什么?
声明一下,我理解const
和readonly
的区别,我知道C#switch
需要const
值,或编译时已知的值。
对我来说,在功能上,使用一堆 if..else if
语句与使用 switch
语句具有相同的结果,因为无论我能用 switch 做什么
语句我也可以用 if
实现,例如:
const int MyConstantValue = 10;
int myCompareValue = 3;
if(myCompareValue == MyConstantValue)
{
//...
}
else
{
//...
}
switch(myCompareValue)
{
case MyConstantValue:
//...
break;
default:
//...
break;
}
这两个构造具有相同的结果:执行 else
或 default
block ,但 if
可以在没有编译时间的情况下执行常量或已知值。为什么 if
可以做到 switch
做不到的事情?
最佳答案
这是因为 C# 开关是仿照 C/C++ 开关建模的,它们具有相同的约束。
这个约束有两个原因:
- 性能:一个 switch 语句可以被编译成一个非常有效的“跳转表”,如果在编译时不知道情况,这是不可能的。
- 正确性:switch 语句在编译时具有可证明的唯一情况,但没有在编译时无法证明的常量情况。
关于c# - 无法在开关 block 中使用只读字段的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41802830/