当前位置: 首页 > 编程语言 > C#

为什么C#的switch语句不允许typeof-GetType()?分享

时间:2023-04-11 01:12:12 C#

为什么C#的switch语句不允许typeof/GetType()?这是一个示例:switch(myObj.GetType()){casetypeof(MyObject):Console.WriteLine("MyObjectishere");休息;}问题是switch(根据规范)只适用于原语(int等)和字符串。但是,如果有F#样式匹配就好了。来自§8.7.2:switch-label:caseconstant-expression:default:...switch语句的控制类型由switch-expression建立。如果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。请注意,字符串通过字典映射作为整数处理。紧随其后的是PeterHallam的帖子;这是一个很好的解释。但是,您可以将TypeCode用于简单类型。switch(Type.GetTypeCode(myObj.GetType())){caseTypeCode.Boolean:...caseTypeCode.Char:...caseTypeCode.String:...caseTypeCode.Object:...default:...}我会在Peter的出色分析中添加以下想法:基本上,“转换”的目的是从多种不同的可能性中选择一种。给定的枚举、整数、布尔值或字符串类型只能有一个值,因此“切换”这样的值是有意义的。但是类型根本不同。给定的值通常有多种类型。类型经常重叠。提议的“类型开关”与开关结构的既定用途不符。PeterHallam在MSDN上有一篇很好的博客文章,解释了切换非常量值的问题。“case标签的顺序在确定执行哪个代码块时变得非常重要。因为case标签表达式不是常量,编译器无法验证case标签的值是否不同,所以这是必须满足的可能性。这与大多数程序员对switch语句的直觉在很多方面都是违反直觉的。大多数程序员会惊讶地发现改变他们的case块的顺序会改变他们的程序的含义。要颠倒它,它会是如果openexpression表达式等于case标签中的表达式,但控件不会转到标签,则会令人惊讶。”你可以做switch(myObj.GetType().Name){case"MyObject":Console.WriteLine("MyObjectishere");休息;这是有效的,因为开关只适用于原始类型(正如其他人所说)。这是typeof不是常量,case必须是常量。C#中的开关仅适用于整数或字符串。myObj.GetType()返回一个类型,它既不是整数也不是字符串。为什么不直接使用tostring()呢?在C#7.0中,您可以做到。请参阅C#7.0案例块中的模式匹配//-----假设spaceItem是SpaceType类型,//并且Planet和Star从SpaceType派生。switch(spaceItem){casePlanetp:if(p.Type!=PlanetType.GasGiant)LandSpacecraft(p);休息;案例Stars:AvoidHeatSource(s);休息;casenull://-----如果spaceItem为null,则处理落在这里,//即使它是Planet或Starnull实例。休息;默认值://-----不是Planet、Star或null的任何其他内容。休息;除了懒惰之外,MS没有充分的理由不实现切换类型。字符串切换是使用“if(..Equals(..))”完成的,情况很少,字典很多。这两种方法都是为所有.NET类型定义的,因为System.Object具有虚拟Equals和GetHashCode。可以说,“Toggle可以使用任何类型的表达式,其中Equals和GetHashCode被覆盖”,它会自动限定字符串、类型等。是的,错误的Equals/GetHashCode实现可以破坏switch语句,但是嘿,你也可以破坏"=="运算符、“foreach”循环等等,所以我真的看不出程序员的错误破坏开关的“大问题”。但即使他们不想为所有类型都允许它,无论出于何种原因,当然Type是安全的,因为Type.Equals()定义明确并且还实现了GetHashCode。另外,我认为您没有考虑继承论点;switch转到其常量(并且type(int)是常量,不要误会)的情况等于表达式-继承是Type类型的另一种“行为”。一个人甚至不需要考虑继承,我的意思是,我们是否会因为2个对象具有其他属性而拒绝比较它们?不,我们不这样做,因为平等总是有定义的。基本上,关键是不同类型之间没有重叠。正如我所说,只有一个原因和一个原因:懒惰。?以上是C#学习教程:为什么C#的switch语句不允许使用typeof/GetType()?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: