Bagikan melalui


19 Enum

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 anggota Red, , Greendan Blue.

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 melalui integral_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 longyang mendasari , seperti dalam contoh, untuk mengaktifkan penggunaan nilai yang berada dalam rentang long tetapi tidak dalam rentang int, 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 -1konstanta , , -2dan -3 tidak berada dalam rentang jenis uintintegral 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 dan Max—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 nilai 10;
  • 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 dan B melingkar. A tergantung pada B secara eksplisit, dan B tergantung pada A 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:

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.