C#6.0语言规范(十四) 枚举

一个枚举类型是一个独特的值类型(值类型)声明一组命名的常量。

这个例子

1 enum Color
2 {
3     Red,
4     Green,
5     Blue
6 }

声明了一个名为枚举类型Color与成员RedGreenBlue

枚举声明

枚举声明声明了一个新的枚举类型。枚举声明以关键字开头enum,并定义枚举的名称,可访问性,基础类型和成员。

 1 enum_declaration
 2     : attributes? enum_modifier* ‘enum‘ identifier enum_base? enum_body ‘;‘?
 3     ;
 4
 5 enum_base
 6     : ‘:‘ integral_type
 7     ;
 8
 9 enum_body
10     : ‘{‘ enum_member_declarations? ‘}‘
11     | ‘{‘ enum_member_declarations ‘,‘ ‘}‘
12     ;

每个枚举类型都有一个相应的整数类型,称为枚举类型的基础类型。此基础类型必须能够表示枚举中定义的所有枚举器值。enum声明可以显式地声明基础类型的bytesbyteshortushortintuintlongulong。请注意,char不能用作基础类型。未明确声明基础类型的枚举声明具有基础类型int

这个例子

1 enum Color: long
2 {
3     Red,
4     Green,
5     Blue
6 }

声明一个基础类型为的枚举long。开发人员可能会选择使用基础类型(long如示例中所示)来启用范围内long但不在范围内的值int,或者为将来保留此选项。

枚举修饰符

一个enum_declaration可任选地包括枚举改性剂的一个序列:

1 enum_modifier
2     : ‘new‘
3     | ‘public‘
4     | ‘protected‘
5     | ‘internal‘
6     | ‘private‘
7     ;

同一修饰符在枚举声明中多次出现是编译时错误。

枚举声明的修饰符与类声明(类修饰符)的含义相同。但请注意,枚举声明中不允许使用abstractsealed修饰符。枚举不能是抽象的,也不允许派生。

枚举成员

枚举类型声明的主体定义零个或多个枚举成员,它们是枚举类型的命名常量。没有两个枚举成员可以具有相同的名称。

1 enum_member_declarations
2     : enum_member_declaration (‘,‘ enum_member_declaration)*
3     ;
4
5 enum_member_declaration
6     : attributes? identifier (‘=‘ constant_expression)?
7     ;

每个枚举成员都有一个关联的常量值。此值的类型是包含枚举的基础类型。每个枚举成员的常量值必须在枚举的基础类型的范围内。这个例子

1 enum Color: uint
2 {
3     Red = -1,
4     Green = -2,
5     Blue = -3
6 }

导致编译时错误,因为在恒定的值-1-2-3不在底层积分类型的范围uint

多个枚举成员可以共享相同的关联值。这个例子

1 enum Color
2 {
3     Red,
4     Green,
5     Blue,
6
7     Max = Blue
8 }

显示一个枚举,其中两个枚举成员 - BlueMax- 具有相同的关联值。

枚举成员的关联值是隐式或显式指定的。如果枚举成员的声明具有constant_expression初始值设定项,则该常量表达式的值(隐式转换为枚举的基础类型)是枚举成员的关联值。如果枚举成员的声明没有初始值设定项,则隐式设置其关联值,如下所示:

  • 如果枚举成员是枚举类型中声明的第一个枚举成员,则其关联值为零。
  • 否则,通过将文本上在前的枚举成员的关联值增加1来获得枚举成员的关联值。此增加的值必须在可由基础类型表示的值范围内,否则会发生编译时错误。

这个例子

 1 using System;
 2
 3 enum Color
 4 {
 5     Red,
 6     Green = 10,
 7     Blue
 8 }
 9
10 class Test
11 {
12     static void Main() {
13         Console.WriteLine(StringFromColor(Color.Red));
14         Console.WriteLine(StringFromColor(Color.Green));
15         Console.WriteLine(StringFromColor(Color.Blue));
16     }
17
18     static string StringFromColor(Color c) {
19         switch (c) {
20             case Color.Red:
21                 return String.Format("Red = {0}", (int) c);
22
23             case Color.Green:
24                 return String.Format("Green = {0}", (int) c);
25
26             case Color.Blue:
27                 return String.Format("Blue = {0}", (int) c);
28
29             default:
30                 return "Invalid color";
31         }
32     }
33 }

打印出枚举成员名称及其相关值。输出是:

1 Red = 0
2 Green = 10
3 Blue = 11

原因如下:

  • 枚举成员Red被自动赋值为零(因为它没有初始值并且是第一个枚举成员);
  • 枚举成员Green被明确赋予值10;
  • 并且枚举成员Blue被自动分配的值大于文本上位于其前面的成员。

枚举成员的关联值不能直接或间接使用其自己的关联枚举成员的值。除了这种循环限制之外,枚举成员初始化器可以自由地引用其他枚举成员初始化器,而不管它们的文本位置如何。在枚举成员初始值设定项中,其他枚举成员的值始终被视为具有其基础类型的类型,因此在引用其他枚举成员时不需要强制转换。

这个例子

1 enum Circular
2 {
3     A = B,
4     B
5 }

导致编译时错误,因为声明AB是循环的。A取决于B明确,并B取决于A隐含。

枚举成员的命名和范围与类中的字段完全类似。枚举成员的范围是其包含枚举类型的主体。在该范围内,枚举成员可以通过其简单名称来引用。在所有其他代码中,枚举成员的名称必须使用其枚举类型的名称进行限定。枚举成员没有任何声明的可访问性 - 如果枚举成员的包含枚举类型可访问,则可以访问该成员。

System.Enum类型

类型System.Enum是所有枚举类型的抽象基类(这与枚举类型的基础类型不同且不同),并且继承自的成员System.Enum在任何枚举类型中都可用。装箱转换(装箱转换)从任何枚举类型来存在System.Enum,和取消装箱转换(解包转换)从存在System.Enum于任何枚举类型。

请注意,System.Enum它本身不是enum_type。相反,它是一个class_type,从中派生所有enum_type。该类型System.Enum继承自类型System.ValueType(System.ValueType类型),而类型继承自类型object。在运行时,type的值System.Enum可以是null或对任何枚举类型的盒装值的引用。

枚举值和操作

每个枚举类型定义一个不同的类型; 在枚举类型和整数类型之间或两个枚举类型之间进行转换需要显式枚举转换(显式枚举转换)。枚举类型可以采用的值集不受其枚举成员的限制。特别是,枚举的基础类型的任何值都可以强制转换为枚举类型,并且是该枚举类型的唯一有效值。

枚举成员具有包含枚举类型的类型(在其他枚举成员初始值设定项中除外:请参阅枚举成员)。枚举成员的值枚举类型中声明E相关联的值v(E)v

以下运算符可以在枚举类型的值可以使用:==!=<><=>=(枚举比较运算符),二进制+(加法运算符),二进制-(减法运算符), ,^,(& 枚举逻辑运算符), (按位求补运算符),并(后缀增量和减量运算符以及前缀增量和减量运算符)。|~++--

每个枚举类型都自动派生自类System.Enum(反过来,派生自System.ValueTypeobject)。因此,此类的继承方法和属性可用于枚举类型的值。

原文地址:https://www.cnblogs.com/strengthen/p/9742915.html

时间: 2024-09-29 09:38:56

C#6.0语言规范(十四) 枚举的相关文章

C#6.0语言规范(十) 类

类是可以包含数据成员(常量和字段),函数成员(方法,属性,事件,索引器,运算符,实例构造函数,析构函数和静态构造函数)和嵌套类型的数据结构.类类型支持继承,这是一种派生类可以扩展和专门化基类的机制. 类声明 一个class_declaration是type_declaration(类型声明,声明一个新的类). 1 class_declaration 2 : attributes? class_modifier* 'partial'? 'class' identifier type_paramet

C#6.0语言规范(十九) 文档注释

C#为程序员提供了一种机制,可以使用包含XML文本的特殊注释语法来记录他们的代码.在源代码文件中,具有特定形式的注释可用于指示工具从这些注释和它们之前的源代码元素生成XML.使用这种语法的注释称为文档注释.它们必须紧接在用户定义的类型(例如类,委托或接口)或成员(例如字段,事件,属性或方法)之前.XML生成工具称为文档生成器.(这个生成器可以是,但不一定是C#编译器本身.)文档生成器生成的输出称为文档文件.文档文件用作a的输入文档查看器 ; 用于生成类型信息及其相关文档的某种视觉显示的工具. 此

C#6.0语言规范(十五) 委托

委托启用其他语言(如C ++,Pascal和Modula)已使用函数指针进行寻址的方案.但是,与C ++函数指针不同,委托是完全面向对象的,与成员函数的C ++指针不同,委托封装了对象实例和方法. 委托声明定义了从类派生的类System.Delegate.委托实例封装了一个调用列表,该列表是一个或多个方法的列表,每个方法都被称为可调用实体.对于实例方法,可调用实体由该实例上的实例和方法组成.对于静态方法,可调用实体仅包含一个方法.使用适当的参数集调用委托实例会导致使用给定的参数集调用每个委托的可

C#6.0语言规范(十六) 异常

C#中的异常提供了一种结构化,统一且类型安全的方法来处理系统级和应用程序级错误条件.C#中的异常机制与C ++的异常机制非常相似,但有一些重要的区别: 在C#中,所有异常必须由派生自的类类型的实例表示System.Exception.在C ++中,任何类型的任何值都可用于表示异常. 在C#中,finally块(try语句)可用于编写在正常执行和异常条件下执行的终止代码.在没有重复代码的情况下,这样的代码很难用C ++编写. 在C#中,系统级异常(例如溢出,被零除和空取消引用)具有明确定义的异常类

C语言第十四回合:结构体大集合

C语言第十四回合:结构体大集合 [学习目标] 1.        结构体 2.        结构体数组 3.        结构体指针 结构体:是数据结构类型,把有内在联系的不同类型的数据统一成一个整体,使它们相互关联.是变量的集合,可以单独使用其的成员. A:结构体的定义 使用关键字:struct struct 结构体名 { 类型标识符  成员名1; 类型标识符  成员名2; -- };     //分号一定不能省 PS: (1)结构定义并不预留内存,结构体变量的定义才引起存储分配 (2) 

Swift4.2语言规范(十) 枚举

一个枚举定义了一个通用型的一组相关的值,使你在你的代码中的一个类型安全的方式这些值来工作. 如果您熟悉C,您将知道C枚举将相关名称分配给一组整数值.Swift中的枚举更加灵活,并且不必为枚举的每个案例提供值.如果一个值(被称为“原始”的值)被提供给每个枚举的情况下,该值可以是一个字符串,一个字符,或任何整数的值或者浮点型. 或者,枚举情况可以指定要与每个不同的案例值一起存储的任何类型的关联值,就像其他语言中的联合或变体一样.您可以将一组通用的相关案例定义为一个枚举的一部分,每个枚举都有一组与之关

C#6.0语言规范(四) 类型

C#语言的类型分为两大类:值类型和引用类型.值类型和引用类型都可以是泛型类型,它们采用一个或多个类型参数.类型参数可以指定值类型和引用类型. 1 type 2 : value_type 3 | reference_type 4 | type_parameter 5 | type_unsafe 6 ; 类型的最终类别(指针)仅在不安全的代码中可用.这在Pointer类型中进一步讨论. 值类型与引用类型的不同之处在于值类型的变量直接包含它们的数据,而引用类型的变量存储对其数据的引用,后者称为对象.对

C#6.0语言规范(三) 基本概念

应用程序启动 具有入口点的程序集称为应用程序.运行应用程序时,会创建一个新的应用程序域.应用程序的几个不同实例可以同时存在于同一台机器上,并且每个实例都有自己的应用程序域. 应用程序域通过充当应用程序状态的容器来启用应用程序隔离.应用程序域充当应用程序中定义的类型及其使用的类库的容器和边界.加载到一个应用程序域中的类型与加载到另一个应用程序域中的相同类型不同,并且应用程序域之间不直接共享对象实例.例如,每个应用程序域都有自己的这些类型的静态变量副本,每个应用程序域最多运行一次类型的静态构造函数.

C#6.0语言规范(七) 表达式

表达式是运算符和操作数的序列.本章定义了操作数和运算符的语法,求值顺序以及表达式的含义. 表达式分类 表达式分类为以下之一: 一个值.每个值都有一个关联的类型. 一个变量.每个变量都有一个关联的类型,即声明的变量类型. 命名空间.具有此分类的表达式只能显示为member_access(成员访问)的左侧.在任何其他上下文中,分类为命名空间的表达式会导致编译时错误. 一种.具有此分类的表达式只能显示为member_access(成员访问)的左侧,或者作为运算as符(作为运算符),is运算符(运算符)