一尘不染

C#switch语句限制-为什么?

c#

编写switch语句时,在case语句中可以打开的内容似乎有两个限制。

例如(是的,我知道,如果您正在做这种事情,那可能意味着您的面向对象(OO)架构很不稳定-这只是一个虚构的示例!),

  Type t = typeof(int);

  switch (t) {

    case typeof(int):
      Console.WriteLine("int!");
      break;

    case typeof(string):
      Console.WriteLine("string!");
      break;

    default:
      Console.WriteLine("unknown!");
      break;
  }

这里的switch()语句以“期望整数类型的值”失败,而case语句以“期望常数的值”失败。

为什么要设置这些限制?其基本依据是什么?我看不出为什么switch语句只 必须
屈服于静态分析,以及为什么打开的值必须是整数(即原始)的任何原因。理由是什么?


阅读 417

收藏
2020-05-19

共1个答案

一尘不染

这是我的原始帖子,引发了一些争论… 因为它是错误的

switch语句与大型if-else语句不同。每个案例都必须是唯一的并进行静态评估。无论您有多少种情况,switch语句都会执行恒定的时间分支。if-
else语句评估每个条件,直到找到一个满足条件的条件。


实际上,C#switch语句 并不 总是恒定时间分支。

在某些情况下,编译器将使用CIL switch语句,该语句实际上是使用跳转表的恒定时间分支。但是,在稀疏情况下,如Ivan
Hamilton
指出的,编译器可能会完全生成其他内容。

实际上,通过编写各种C#switch语句(有些稀疏,有些密集)并使用ildasm.exe工具查看生成的CIL,很容易验证。

2020-05-19