Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
19.1 Umum
Jenis enum adalah jenis nilai yang berbeda (§8,3) yang mendeklarasikan sekumpulan konstanta bernama.
Contoh: Contoh
enum Color { Red, Green, Blue }
menyatakan jenis enum bernama
Color
dengan anggotaRed
, ,Green
danBlue
.contoh akhir
19.2 Deklarasi enum
Deklarasi enum menyatakan jenis enum baru. Deklarasi enum dimulai dengan kata kunci enum
, dan menentukan nama, aksesibilitas, jenis dasar, dan anggota enum.
enum_declaration
: attributes? enum_modifier* 'enum' identifier enum_base? enum_body ';'?
;
enum_base
: ':' integral_type
| ':' integral_type_name
;
integral_type_name
: type_name // Shall resolve to an integral type other than char
;
enum_body
: '{' enum_member_declarations? '}'
| '{' enum_member_declarations ',' '}'
;
Setiap jenis enum memiliki jenis integral yang sesuai yang disebut jenis enum yang mendasar. Jenis yang mendasar ini akan dapat mewakili semua nilai enumerator yang ditentukan dalam enumerasi. Jika enum_base ada, enum_base secara eksplisit menyatakan jenis yang mendasar. Jenis yang mendasar adalah salah satu jenis integral (§8.3.6) selain char
. Jenis yang mendasar dapat ditentukan baik oleh integral_type
(§8.3.5), atau integral_type_name
. integral_type_name
diselesaikan dengan cara yang sama seperti type_name
(§7.8.1), termasuk mempertimbangkan penggunaan direktif (§14.5).
Catatan:
char
Jenis tidak dapat digunakan sebagai jenis yang mendasar, baik dengan kata kunci atau melaluiintegral_type_name
. catatan akhir
Deklarasi enum yang tidak secara eksplisit menyatakan jenis yang mendasar memiliki jenis yang mendasar dari int
.
Contoh: Contoh
enum Color : long { Red, Green, Blue }
mendeklarasikan enum dengan jenis yang mendasar dari
long
.contoh akhir
Catatan: Pengembang mungkin memilih untuk menggunakan jenis
long
yang mendasari , seperti dalam contoh, untuk mengaktifkan penggunaan nilai yang berada dalam rentanglong
tetapi tidak dalam rentangint
, atau untuk mempertahankan opsi ini untuk masa depan. catatan akhir
Catatan: C# memungkinkan koma berikutnya dalam enum_body, seperti halnya memungkinkan koma dalam array_initializer (§17,7). catatan akhir
Deklarasi enum tidak dapat menyertakan daftar parameter jenis, tetapi enum apa pun yang disarangkan di dalam deklarasi kelas generik atau deklarasi struktur generik adalah deklarasi enum generik, karena argumen jenis untuk jenis yang berisi harus disediakan untuk membuat jenis yang dibangun (§8.4).
19.3 Pengubah enum
Enum_declaration dapat secara opsional menyertakan urutan pengubah enum:
enum_modifier
: 'new'
| 'public'
| 'protected'
| 'internal'
| 'private'
;
Ini adalah kesalahan waktu kompilasi agar pengubah yang sama muncul beberapa kali dalam deklarasi enum.
Pengubah deklarasi enum memiliki arti yang sama dengan deklarasi kelas (§15.2.2). Namun, pengubah abstract
, dan sealed
, dan static
tidak diizinkan dalam deklarasi enum. Enum tidak dapat abstrak dan tidak mengizinkan derivasi.
19.4 Anggota Enum
Isi deklarasi jenis enum mendefinisikan nol atau lebih anggota enum, yang merupakan konstanta bernama dari jenis enum. Tidak ada dua anggota enum yang dapat memiliki nama yang sama.
enum_member_declarations
: enum_member_declaration (',' enum_member_declaration)*
;
enum_member_declaration
: attributes? identifier ('=' constant_expression)?
;
Setiap anggota enum memiliki nilai konstanta terkait. Jenis nilai ini adalah jenis yang mendasar untuk enum yang berisi. Nilai konstanta untuk setiap anggota enum harus berada dalam rentang jenis yang mendasar untuk enum.
Contoh: Contoh
enum Color: uint { Red = -1, Green = -2, Blue = -3 }
menghasilkan kesalahan waktu kompilasi karena nilai
-1
konstanta , ,-2
dan-3
tidak berada dalam rentang jenisuint
integral yang mendasar .contoh akhir
Beberapa anggota enum dapat berbagi nilai terkait yang sama.
Contoh: Contoh
enum Color { Red, Green, Blue, Max = Blue }
menunjukkan enum di mana dua anggota enum—
Blue
danMax
—memiliki nilai terkait yang sama.contoh akhir
Nilai terkait dari anggota enum ditetapkan baik secara implisit atau eksplisit. Jika deklarasi anggota enum memiliki penginisialisasi constant_expression , nilai ekspresi konstanta tersebut, secara implisit dikonversi ke jenis enum yang mendasar, adalah nilai terkait dari anggota enum. Jika deklarasi anggota enum tidak memiliki inisialisasi, nilai terkaitnya diatur secara implisit, sebagai berikut:
- Jika anggota enum adalah anggota enum pertama yang dinyatakan dalam jenis enum, nilai terkaitnya adalah nol.
- Jika tidak, nilai terkait anggota enum diperoleh dengan meningkatkan nilai terkait dari anggota enum sebelumnya secara tekstual oleh satu. Nilai yang ditingkatkan ini harus berada dalam rentang nilai yang dapat diwakili oleh jenis yang mendasar, jika tidak, kesalahan waktu kompilasi terjadi.
Contoh: Contoh
enum Color { Red, Green = 10, Blue } class Test { static void Main() { Console.WriteLine(StringFromColor(Color.Red)); Console.WriteLine(StringFromColor(Color.Green)); Console.WriteLine(StringFromColor(Color.Blue)); } static string StringFromColor(Color c) { switch (c) { case Color.Red: return $"Red = {(int) c}"; case Color.Green: return $"Green = {(int) c}"; case Color.Blue: return $"Blue = {(int) c}"; default: return "Invalid color"; } } }
mencetak nama anggota enum dan nilai terkaitnya. Outputnya adalah:
Red = 0 Green = 10 Blue = 11
untuk alasan berikut:
- anggota
Red
enum secara otomatis diberi nilai nol (karena tidak memiliki inisialisasi dan merupakan anggota enum pertama);- anggota
Green
enum secara eksplisit diberikan nilai10
;- dan anggota
Blue
enum secara otomatis diberi nilai satu lebih besar dari anggota yang secara tekstual mendahuluinya.contoh akhir
Nilai terkait dari anggota enum tidak boleh, secara langsung atau tidak langsung, menggunakan nilai anggota enum terkaitnya sendiri. Selain pembatasan edaran ini, penginisialisasi anggota enum dapat dengan bebas merujuk ke penginisialisasi anggota enum lainnya, terlepas dari posisi tekstual mereka. Dalam penginisialisasi anggota enum, nilai anggota enum lain selalu diperlakukan memiliki jenis jenis yang mendasar, sehingga cast tidak diperlukan saat merujuk ke anggota enum lainnya.
Contoh: Contoh
enum Circular { A = B, B }
menghasilkan kesalahan waktu kompilasi karena deklarasi
A
danB
melingkar.A
tergantung padaB
secara eksplisit, danB
tergantung padaA
secara implisit.contoh akhir
Anggota Enum diberi nama dan tercakup dengan cara yang sama persis dianalogikan dengan bidang dalam kelas. Cakupan anggota enum adalah isi dari jenis enum yang mengandung. Dalam cakupan itu, anggota enum dapat disebut dengan nama sederhana mereka. Dari semua kode lain, nama anggota enum harus memenuhi syarat dengan nama jenis enum-nya. Anggota Enum tidak memiliki aksesibilitas yang dinyatakan—anggota enum dapat diakses jika jenis enum yang berisi dapat diakses.
19.5 Jenis System.Enum
Jenisnya System.Enum
adalah kelas dasar abstrak dari semua jenis enum (ini berbeda dan berbeda dari jenis enum yang mendasar), dan anggota yang diwariskan System.Enum
tersedia dalam jenis enum apa pun. Konversi tinju (§10.2.9) ada dari jenis enum apa pun ke System.Enum
, dan konversi pembukaan kotak (§10.3.7) ada dari System.Enum
ke jenis enum apa pun.
Perhatikan bahwa System.Enum
bukan itu sendiri enum_type. Sebaliknya, itu adalah class_type dari mana semua enum_typediturunkan. Jenis System.Enum
mewarisi dari jenis System.ValueType
(§8.3.2), yang, pada gilirannya, mewarisi dari jenis object
. Pada run-time, nilai jenis System.Enum
dapat berupa null
atau referensi ke nilai kotak dari jenis enum apa pun.
19.6 Nilai dan operasi Enum
Setiap jenis enum mendefinisikan jenis yang berbeda; konversi enumerasi eksplisit (§10.3.3) diperlukan untuk mengonversi antara jenis enum dan jenis integral, atau antara dua jenis enum. Kumpulan nilai jenis enum sama dengan kumpulan nilai dari jenis yang mendasar dan tidak dibatasi untuk nilai konstanta bernama. Nilai apa pun dari jenis enum yang mendasar dapat ditransmisikan ke jenis enum, dan merupakan nilai valid yang berbeda dari jenis enum tersebut.
Anggota Enum memiliki jenis jenis enum yang berisi mereka (kecuali dalam penginisialisasi anggota enum lainnya: lihat §19.4). Nilai anggota enum yang dinyatakan dalam jenis E
enum dengan nilai v
terkait adalah (E)v
.
Operator berikut dapat digunakan pada nilai jenis enum:
==
, ,!=
,>
<
,<=
,>=
(§12.12.6)- biner
+
(§12.10.5) - biner
-
(§12.10.6) ^
, ,&
|
(§12.13.3)~
(§12.9.5)++
,--
(§12.8.15 dan §12.9.6)sizeof
(§23.6.9)
Setiap jenis enum secara otomatis berasal dari kelas System.Enum
(yang, pada gilirannya, berasal dari System.ValueType
dan object
). Dengan demikian, metode dan properti yang diwariskan dari kelas ini dapat digunakan pada nilai jenis enum.
ECMA C# draft specification