C 語言規範 版本5 0 第14章 列舉

2022-08-27 06:18:09 字數 3634 閱讀 5085

列舉型別 (enum type) 是一種獨特的值型別(第 4.1 節),它用於宣告一組命名的常量。

下面的示例

enum color

宣告乙個名為 color 的列舉型別,該型別具有三個成員:red、green 和 blue。

列舉宣告用於宣告新的列舉型別。列舉宣告以關鍵字 enum 開始,然後定義該列舉的名稱、可訪問性、基礎型別和成員。

enum-declaration:

attributesopt   enum-modifiersopt   enum  

identifier   enum-baseopt   enum-body  

;opt

enum-base:

:  integral-type

enum-body:

每個列舉型別都有乙個相應的整型型別,稱為該列舉型別的基礎型別 (underlying type)。此基礎型別必須能夠表示該列舉中定義的所有列舉數值。列舉宣告可以顯式地宣告 byte、sbyte、short、ushort、int、uint、long 或 ulong 的基礎型別。請注意 char 不能用作基礎型別。沒有顯式地宣告基礎型別的列舉宣告意味著所對應的基礎型別是 int。

下面的示例

enum color:

long

宣告了乙個基礎型別為 long 的列舉。開發人員可以像本示例一樣選擇使用 long 基礎型別,以便能夠使用在 long 範圍內而不是在 int 範圍內的值,或者保留此選項供將來使用。

enum-declaration 可以根據需要包含乙個列舉修飾符序列:

enum-modifiers:

enum-modifier

enum-modifiers   enum-modifier

enum-modifier:

newpublic

protected

internal

private

同一修飾符在乙個列舉宣告中多次出現屬於編譯時錯誤。

列舉宣告的修飾符與類宣告(第 10.1.1 節)的修飾符具有同樣的意義。然而請注意,在列舉宣告中不允許使用 abstract 和 sealed 修飾符。列舉不能是抽象的,也不允許派生。

列舉型別宣告體用於定義零個或多個列舉成員,這些成員是該列舉型別的命名常量。任意兩個列舉成員不能具有相同的名稱。

enum-member-declarations:

enum-member-declaration

enum-member-declarations   ,   enum-member-declaration

enum-member-declaration:

attributesopt   identifier

attributesopt  

identifier   =   constant-expression

每個列舉成員均具有相關聯的常量值。此值的型別就是包含了它的那個列舉的基礎型別。每個列舉成員的常量值必須在該列舉的基礎型別的範圍之內。下面的示例

enum color:

uint

會導致編譯時錯誤,因為常量值 -1、-2 和 –3 不處於基礎整型 uint 的範圍中。

多個列舉成員可以共享同乙個關聯值。下面的示例

enum color

演示乙個列舉,其中的兩個列舉成員(blue 和 max)具有相同的關聯值。

乙個列舉成員的關聯值或隱式地、或顯式地被賦值。如果列舉成員的宣告中具有 constant-expression 初始值設定項,則該常量表示式的值(它隱式轉換為列舉的基礎型別)就是該列舉成員的關聯值。如果列舉成員的宣告不具有初始值設定項,則它的關聯值按下面規則隱式地設定:

下面的示例

using system;

enum color

class test

static string stringfromcolor(color c) ", (int) c);

case color.green:

return

string.format("green = ", (int) c);

case color.blue:

return

string.format("blue = ", (int) c);

default:

return "invalid

color";}}

}輸出列舉成員名稱和它們的關聯值。輸出為:

red = 0

green = 10

blue = 11

原因如下:

列舉成員的關聯值不能直接或間接地使用它自己的關聯列舉成員的值。除了這個迴圈性限制外,列舉成員初始值設定項可以自由地引用其他的列舉成員初始值設定項,而不必考慮它們所在的文字位置的排列順序。在列舉成員初始值設定項內,其他列舉成員的值始終被視為屬於所對應的基礎型別,因此在引用其他列舉成員時,沒有必要使用強制轉換。

下面的示例

enum circular

產生編譯時錯誤,因為 a 和 b 的宣告是迴圈的。a 顯式依賴於 b,而 b 隱式依賴於 a。

列舉成員的命名方式和作用範圍與類中的字段完全類似。列舉成員的範圍是包含了它的列舉型別的體。在該範圍內,列舉成員可以用它們的簡單名稱引用。在所有其他**中,列舉成員的名稱必須用它的列舉型別的名稱限定。列舉成員不具有任何宣告可訪問性,如果乙個列舉型別是可訪問的,則它所含的所有列舉成員都是可訪問的。

system.enum 型別是所有列舉型別的抽象基類(它是一種與列舉型別的基礎型別不同的獨特型別),並且從 system.enum 繼承的成員在任何列舉型別中都可用。存在從任何列舉型別到 system.enum 的裝箱轉換(第 4.3.1 節),並且存在從 system.enum 到任何列舉型別的取消裝箱轉換(第 4.3.2 節)。

請注意,system.enum 本身不是

enum-type。而是

class-type,所有

enum-type 都是從它派生的。型別 system.enum 從型別 system.valuetype(第 4.1.1 節)繼承,而後者又從型別 object

繼承。在執行時,型別 system.enum 的值可以是 null 或是對任何列舉型別的裝箱值的引用。

每個列舉型別都定義了乙個不同的型別;需要使用顯式列舉轉換(第 6.2.2 節)在列舉型別和整型之間或在兩個列舉型別之間進行轉換。乙個列舉型別的值域不受它的列舉成員限制。具體而言,乙個列舉的基礎型別的任何乙個值都可以被強制轉換為該列舉型別,成為該列舉型別的乙個獨特的有效值。

列舉成員所屬的型別就是宣告了它們的那個列舉(出現在其他列舉成員初始值設定項中時除外:請參見第 14.3 節)。在列舉型別 e 中宣告且關聯值為 v 的列舉成員的值為 (e)v。

以下運算子可用於列舉型別的值:==、!=、<、>、<=、>=(第 7.10.5 節)、二元 +(第 7.8.4 節)、二元 ‑(第 7.8.5 節)^、&、|(第 7.11.2 節)、~(第 7.7.4 節)、++ 和 --(第 7.6.9 節和第 7.7.5 節)。

每個列舉型別自動派生自類 system.enum (後者又派生自 system.valuetype 和 object) \t "see also enum" \t "see also enum"  \t "see also enum"  \t "see enum" \t "see also

enum"  \t "see enum" 。因此,此類的派生方法和屬性可以用在列舉型別的值上。

C 語言規範版本5 0學習 1 11 特性

c 程式中的型別 成員和其他實體都支援修飾符,這些修飾符控制它們的行為的某些方面。例如,方法的可訪問性是使用 public protected internal 和 private 修飾符來控制的。c 使此功能一般化,以便能夠將使用者定義型別的宣告資訊附加到程式實體,並在執行時檢索。這種附加的宣告資...

C 語言規範版本5 0學習 4 型別

c 語言的型別劃分為兩大類 值型別 value type 和引用型別 reference type 值型別和引用型別都可以為泛型型別 generic type 泛型型別採用乙個或多個型別引數。型別引數可以指定值型別和引用型別。type value type reference type type p...

C 語言規範版本5 0學習 3 1成員

命名空間和型別具有成員 member 通常可以通過限定名來訪問實體的成員。限定名以對實體的引用開頭,後跟乙個 標記,再接成員的名稱。型別的成員或者是在該型別宣告中宣告的,或者是從該型別的基類繼承 inherit 的。當型別從基類繼承時,基類的所有成員 例項建構函式 析構函式和靜態建構函式除外 都成為...