无法在 switch 块中使用只读字段的原因是什么?

lda*_*dam 7 c# runtime constants switch-statement language-lawyer

我很清楚 C# 不允许块readonly中的字段switch,这就是这个问题所解决的问题。

我想了解为什么会出现这种情况。这只是一个任意的语言规范怪癖,还是背后有技术原因?如果有,技术原因是什么?

让我澄清一下,我理解const和之间的区别readonly,并且我知道 C#switch需要const值,或者在编译时已知的值。对我来说,从功能上来说,使用一堆if..else if语句与使用一条语句具有相同的结果switch,因为无论我能用一条switch语句做什么,我也可以用 an 实现if,例如:

const int MyConstantValue = 10;

int myCompareValue = 3;
if(myCompareValue == MyConstantValue)
{
  //...
}
else
{
  //...
}

switch(myCompareValue)
{
  case MyConstantValue:
    //...
    break;
  default:
    //...
    break;
}
Run Code Online (Sandbox Code Playgroud)

这两个构造具有相同的结果:执行elseor块,但可以在没有编译时常量或已知值的情况下执行此操作。为什么一个人可以做到而一个人却做不到?defaultififswitch

Mat*_*son 5

原因是 C# 开关是在 C/C++ 开关之后建模的,它们具有相同的约束。

造成这种限制的原因有两个:

  • 性能: switch 语句可以编译成非常高效的“跳转表”,如果编译时不知道情况,则这是不可能的。
  • 正确性:switch 语句在编译时具有可证明的唯一情况,但没有在编译时无法证明的常量情况。