c# - 无法在开关 block 中使用只读字段的原因是什么?

标签 c# switch-statement runtime constants language-lawyer

我很清楚 C# 不允许 switch block 中的 readonly 字段,这就是 this question地址。

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

声明一下,我理解constreadonly的区别,我知道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;
}

这两个构造具有相同的结果:执行 elsedefault block ,但 if 可以在没有编译时间的情况下执行常量或已知值。为什么 if 可以做到 switch 做不到的事情?

最佳答案

这是因为 C# 开关是仿照 C/C++ 开关建模的,它们具有相同的约束。

这个约束有两个原因:

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

关于c# - 无法在开关 block 中使用只读字段的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41802830/

相关文章:

Java 调用 bash "su -c ... username"退出代码 125

c# - 使用 ItemsControl 绑定(bind)对象数组

c# - 使用 C# 和控制台应用程序检测事件窗口的更改

c# - 从 WPF 项目创建单个 Exe 文件

java - 在 Java 中使用 switch 的问题

java - 开关盒不起作用。 java

java - 字节好友可以在运行时创建字段和方法注解吗?

c# - 以编程方式检查 Windows 7 是否已激活

javascript - 意外的标记 'case'(switch 语句)

c++ - 用模板重写的类会使程序变慢(在运行时)