Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# X是枚举-是否符合规范?_C#_Enums_Language Implementation - Fatal编程技术网

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的值类型**这可能是枚举
假设枚举值与上面列表中的“引用类型”匹配,则规范说明如下:

…如果D[RHS的动态类型]和T[LHS]是同一类型,如果D是引用类型且存在从D到T的隐式引用转换,或者如果D是值类型且存在从D到T的装箱转换,则结果为真

is Enum
的情况下,这些条件是否严格正确?例如,
是class
是struct
没有编译器支持


那么,对
is Enum
的支持是符合规范的,还是一个实现决策?

这里要问的问题我还不完全清楚,但我希望我现在就知道了


鉴于以下代码:

void F(Object obj) {
  var isEnum obj is Enum;
  ...
}
obj
是枚举类型的实例时,C#标准的哪些部分规定
isEnum
为真


在第14.9.10节中,操作员是否处于工作状态,有五个项目符号描述了如何对其进行评估:

  • 第一个项目是关于
    obj
    的类型比
    System.Object
    更具体的情况

  • 第二项是关于可为空的类型

  • 第四个项目是关于泛型类型的

  • 第五个项目符号是当没有匹配项时,
    is
    运算符的计算结果为false,而我们知道它不是

您可能希望第三个项目符号适用于上述代码。第三个项目符号有四个子项目符号:

  • obj
    为空时,第一个子项目符号适用

  • 第二个子项目符号是关于可空类型的

  • 第四个子项目符号是当没有匹配项时,
    is
    运算符的计算结果为false,而我们知道它不是

您可能希望第三个子项目符号适用:

否则,设R为e引用的实例的运行时类型。如果R和T是同一类型,如果 R是引用类型,存在从R到T的隐式引用转换,或者如果R是值类型 T是一个由R实现的接口类型,结果是真的

然而,这里似乎缺少一些有关枚举类型的特定信息。假设
obj
是枚举类型
MyEnum
的实例,则没有任何子句与上述代码匹配:

  • R和T不是同一类型,因为R是
    MyEnum
    而T是
    System.Enum

  • R是MyEnum,它是一种值类型(11.1.9),而不是一种参考类型

  • typeof(Enum).IsValueType => false
    
  • T是不是接口类型的
    System.Enum

我不想声称规范中存在错误,但在详细阅读了14.9.10之后,我无法看到
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