C# X是枚举-是否符合规范?
讨论如何使用C# X是枚举-是否符合规范?,c#,enums,language-implementation,C#,Enums,Language Implementation,讨论如何使用is Enum测试对象,以查看其是否包含枚举值 这在规范中的任何地方都有规定吗?上的条目为(版本4.0中的7.10.10)列出了以下可能的右侧值: 匿名函数 方法组 空的 引用类型**这可能是一个枚举 可空类型 不可为null的值类型**这可能是枚举 假设枚举值与上面列表中的“引用类型”匹配,则规范说明如下: …如果D[RHS的动态类型]和T[LHS]是同一类型,如果D是引用类型且存在从D到T的隐式引用转换,或者如果D是值类型且存在从D到T的装箱转换,则结果为真 在is Enum
is Enum
测试对象,以查看其是否包含枚举值
这在规范中的任何地方都有规定吗?上的条目为
(版本4.0中的7.10.10)列出了以下可能的右侧值:
- 匿名函数
- 方法组
- 空的
- 引用类型**这可能是一个枚举
- 可空类型
- 不可为null的值类型**这可能是枚举
is Enum
的情况下,这些条件是否严格正确?例如,是class
或是struct
没有编译器支持
那么,对
is Enum
的支持是符合规范的,还是一个实现决策?这里要问的问题我还不完全清楚,但我希望我现在就知道了
鉴于以下代码:
void F(Object obj) {
var isEnum obj is Enum;
...
}
当obj
是枚举类型的实例时,C#标准的哪些部分规定isEnum
为真
在第14.9.10节中,操作员是否处于工作状态,有五个项目符号描述了如何对其进行评估:
- 第一个项目是关于
的类型比obj
更具体的情况System.Object
- 第二项是关于可为空的类型
- 第四个项目是关于泛型类型的
- 第五个项目符号是当没有匹配项时,
运算符的计算结果为false,而我们知道它不是is
- 当
为空时,第一个子项目符号适用obj
- 第二个子项目符号是关于可空类型的
- 第四个子项目符号是当没有匹配项时,
运算符的计算结果为false,而我们知道它不是is
obj
是枚举类型MyEnum
的实例,则没有任何子句与上述代码匹配:
- R和T不是同一类型,因为R是
而T是MyEnum
System.Enum
- R是MyEnum,它是一种值类型(11.1.9),而不是一种参考类型
typeof(Enum).IsValueType => false
System.Enum
is Enum
如何在给定对枚举类型的框式引用的情况下计算为true
知道标准人员通常比我聪明得多,我可能忽略了一些东西,但即使我没有,这也不应该阻止您使用
is Enum
来测试类型是否为Enum。我确信它不是一个可以像这样使用的实现细节。枚举是一个实际的类型,而as类和结构不是。因此,枚举可以在as类和结构不能使用的右侧使用。Enum
是引用类型
typeof(Enum).IsValueType => false
有趣的是
typeof(ValueType).IsValueType => false
不支持
is class
或is struct
,因为没有将类或结构与其他类型区分开来的公共基类型是枚举
有效,因为它是所有枚举的基础的实际类型。而Enum
是一种引用类型,因此最后一部分适用:
如果D是值类型,并且存在从D到T的装箱转换
D
(左侧表达式的类型)是值类型。而T
是Enum
,它是D
的基本类型。因此有一个从D
到Enum
的装箱转换,因此表达式的值是true
§14.4系统中明确规定了从任何枚举到enum
的装箱转换。枚举类型:
类型System.Enum
是所有枚举类型的抽象基类(这与枚举类型的基础类型不同),从System.Enum继承的成员在任何枚举类型中都可用。存在从任何枚举类型到System.enum
的装箱转换,以及从System.enum
到任何枚举类型的取消装箱转换
请注意,System.Enum
本身不是枚举类型。相反,它是派生所有枚举类型的类类型。类型System.Enum
继承自类型System.ValueType
,该类型又继承自类型对象。在运行时,System.Enum
类型的值可以为null,也可以是对任何枚举类型的装箱值的引用
是什么让你认为枚举值是引用类型?@BoltClock:因为代码这么说typeof(Enum).IsValueType=>false
您是否特别询问Enum
类型或用户定义的枚举?似乎有点困惑(包括me;p),您如何拥有Enum
的实例?它或多或少是一个抽象类,不完全是。你只是自相矛盾:)有趣。。。嗯,嗯。。。埃里克·利珀特在哪里。。。也许他能回答这个问题…@leppi