为什么C#switch语句不允许使用typeof/GetType()?

Joa*_*nge 13 .net c# reflection switch-statement

如下例所示:

switch ( myObj.GetType ( ) )
{
    case typeof(MyObject):
        Console.WriteLine ( "MyObject is here" );
        break;
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*ely 19

其次是Peter Hallam的帖子; 这是一个很好的解释.

但是,您可以使用TypeCode处理简单类型.

switch (Type.GetTypeCode(myObj.GetType())) {
    case TypeCode.Boolean: ...
    case TypeCode.Char: ...
    case TypeCode.String: ...
    case TypeCode.Object: ...
    default: ...
} 
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 14

我会在彼得的优秀分析中加入以下思想:

基本上,"转换"的目的是选择一些不同的可能性之一.给定的枚举值,整数,布尔值或字符串类型只能是一个值,因此"切换"这样的值是有意义的.但类型根本不同.给定值通常有许多类型.类型经常重叠.所提出的"类型开关" 与开关结构的陈述目的不匹配.


Mar*_*ell 13

问题是switch(根据规范)仅适用于基元(int等)和字符串.但是,是的,有F#式匹配会很不错.

从§8.7.2开始:

switch-label:
   case   constant-expression   :
   default   :
Run Code Online (Sandbox Code Playgroud)

... switch语句的控制类型由switch表达式建立.如果switch表达式的类型是sbyte,byte,short,ushort,int,uint,long,ulong,char,string或enum-type,那么这就是switch语句的控制类型.否则,从switch表达式的类型到以下可能的控制类型之一,必须存在一个用户定义的隐式转换(第6.4节):sbyte,byte,short,ushort,int,uint,long,ulong,char,string .如果不存在此类隐式转换,或者存在多个此类隐式转换,则会发生编译时错误.

然而,显而易见的是,使用这种受限制的集合允许简单(和有效)IL.请注意,string通过字典映射处理整数.

  • 然而,vb.net允许切换中的任何内容 (3认同)

Dan*_*plo 5

Peter Hallam在MSDN上有一篇很好的博客文章,解释了切换非常量值的问题.

"案例标签的顺序在确定执行哪个代码块时变得非常重要.因为案例标签表达式不是常量,编译器无法验证案例标签的值是不同的,所以这是一种必须满足的可能性.这与大多数程序员对switch语句的直觉有很大的不同.大多数程序员都会惊讶地发现改变他们的case块的顺序改变了他们程序的意义.为了扭转它,这将是令人惊讶的如果打开的表达式等于案例标签中的表达式,但控件没有转到该标签."


Kyl*_*man 5

你可以做

switch ( myObj.GetType().Name )
{
    case "MyObject":
        Console.WriteLine ( "MyObject is here" );
        break;
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为切换仅适用于原始类型(正如其他人所说)。