Aracılığıyla paylaş


19 Sabit Listesi

19.1 Genel

Sabit listesi türü, adlandırılmış sabitler kümesini bildiren ayrı bir değer türüdür (§8,3).

Örnek: Örnek

enum Color
{
    Red,
    Green,
    Blue
}

, Greenve Blueüyeleriyle Redadlı Color bir sabit listesi türü bildirir.

son örnek

19.2 Numaralandırma bildirimleri

Sabit listesi bildirimi yeni bir sabit listesi türü bildirir. Sabit listesi bildirimi anahtar sözcüğüyle enumbaşlar ve adı, erişilebilirliği, temel alınan türü ve sabit listesi üyelerini tanımlar.

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 ',' '}'
    ;

Her sabit listesi türü, sabit listesi türünün temel türü olarak adlandırılan karşılık gelen bir tamsayı türüne sahiptir. Bu temel tür, numaralandırmada tanımlanan tüm numaralandırıcı değerlerini temsil edebilecektir. enum_base varsa, temel alınan türü açıkça bildirir. Temel alınan tür, dışındaki charintegral türlerinden (§8.3.6) biri olmalıdır. Temel alınan tür bir integral_type (§8.3.5) veya bir integral_type_nametarafından belirtilebilir. kullanım integral_type_name yönergelerini (§14.5) hesaba katarak (§7.8.1) ile aynı şekilde type_name çözümlenir.

Not: Tür char , anahtar sözcük veya aracılığıyla integral_type_nametemel tür olarak kullanılamaz. son not

Temel alınan bir türü açıkça bildirmeyen bir sabit listesi bildiriminin temel alınan türü vardır int.

Örnek: Örnek

enum Color : long
{
    Red,
    Green,
    Blue
}

temel alınan türüne longsahip bir sabit listesi bildirir.

son örnek

Not: Geliştirici, örneğinde olduğu gibi, aralığında yer alan ancak aralığında olmayan intdeğerlerin long kullanımını etkinleştirmek veya bu seçeneği gelecekte korumak için temel alınan türünü longkullanmayı seçebilir. son not

Not: C# bir enum_body sondaki virgüle izin verir, aynı array_initializer (§17.7) bir virgüle izin verdiği gibi. son not

Sabit listesi bildirimi tür parametre listesi içeremez, ancak genel bir sınıf bildiriminin veya genel yapı bildiriminin içinde iç içe geçmiş herhangi bir sabit listesi genel bir sabit listesi bildirimidir, çünkü kapsayan türün tür bağımsız değişkenleri oluşturulmuş bir tür (§8.4) oluşturmak için sağlanmalıdır.

19.3 Numaralandırma değiştiricileri

enum_declaration isteğe bağlı olarak bir sabit listesi değiştirici dizisi içerebilir:

enum_modifier
    : 'new'
    | 'public'
    | 'protected'
    | 'internal'
    | 'private'
    ;

Aynı değiştiricinin bir sabit listesi bildiriminde birden çok kez görünmesi derleme zamanı hatasıdır.

Bir sabit listesi bildiriminin değiştiricileri, sınıf bildiriminin (§15.2.2) anlamları aynıdır. Ancak, bir sabit listesi bildiriminde abstract, sealedve ve static değiştiricilerine izin verilmez. Sabit listeleri soyut olamaz ve türetmeye izin vermez.

19.4 Numaralandırma üyeleri

Bir sabit listesi türü bildiriminin gövdesi, sabit listesi türünün adlandırılmış sabitleri olan sıfır veya daha fazla sabit listesi üyesini tanımlar. Hiçbir sabit listesi üyesi aynı ada sahip olamaz.

enum_member_declarations
    : enum_member_declaration (',' enum_member_declaration)*
    ;
enum_member_declaration
    : attributes? identifier ('=' constant_expression)?
    ;

Her sabit listesi üyesinin ilişkili bir sabit değeri vardır. Bu değerin türü, içeren sabit listesi için temel alınan türdür. Her bir sabit üyenin sabit değeri, sabit sabit listesi için temel alınan türün aralığında olmalıdır.

Örnek: Örnek

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

, ve -3 sabit değerleri temel alınan tam sayı -1-2türünün uintaralığında olmadığından derleme zamanı hatasıyla sonuçlanır.

son örnek

Birden çok sabit listesi üyesi aynı ilişkili değeri paylaşabilir.

Örnek: Örnek

enum Color
{
    Red,
    Green,
    Blue,
    Max = Blue
}

, iki sabit listesi üyesinin (Blue ve Max) aynı ilişkili değere sahip olduğu bir sabit listesi gösterir.

son örnek

Bir sabit listesi üyesinin ilişkili değeri örtük veya açıkça atanır. Sabit listesi üyesinin bildiriminde constant_expression başlatıcısı varsa, bu sabit ifadenin değeri, sabit sayının temel alınan türüne örtük olarak dönüştürülür ve enum üyesinin ilişkili değeridir. Sabit listesi üyesinin bildiriminde başlatıcı yoksa, ilişkili değeri örtük olarak aşağıdaki gibi ayarlanır:

  • Sabit listesi üyesi enum türünde bildirilen ilk sabit listesi üyesiyse, ilişkili değeri sıfırdır.
  • Aksi takdirde, sabit listesi üyesinin ilişkili değeri, metin olarak enum üyesinden önceki üyenin ilişkili değeri bir artırılarak elde edilir. Bu artan değer, temel alınan tür tarafından temsil edilebilecek değerler aralığında olmalıdır, aksi takdirde bir derleme zamanı hatası oluşur.

Örnek: Örnek

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";
      }
   }
}

sabit listesi üye adlarını ve ilişkili değerlerini yazdırır. Çıktı şu olur:

Red = 0
Green = 10
Blue = 11

aşağıdaki nedenlerle:

  • sabit listesi üyesine Red otomatik olarak sıfır değeri atanır (başlatıcısı olmadığından ve ilk sabit listesi üyesi olduğundan);
  • sabit listesi üyesine Green açıkça değeri 10verilir;
  • ve sabit listesi üyesine Blue otomatik olarak kendisinden önce gelen üyeden bir büyük değer atanır.

son örnek

Bir sabit listesi üyesinin ilişkili değeri, doğrudan veya dolaylı olarak kendi ilişkili sabit listesi üyesinin değerini kullanmaz. Bu döngüsellik kısıtlaması dışında, numaralandırma üyesi başlatıcıları metin konumlarından bağımsız olarak diğer sabit listesi üye başlatıcılarına serbestçe başvurabilir. Bir numaralandırma üyesi başlatıcısı içinde, diğer sabit listesi üyelerinin değerleri her zaman kendi temel türlerinin türüne sahip olarak değerlendirilir, böylece diğer sabit listesi üyelerine başvururken atamalar gerekli değildir.

Örnek: Örnek

enum Circular
{
    A = B,
    B
}

ve bildirimleri döngüsel olduğundan derleme zamanı hatasıyla A B sonuçlanır. A açıkça bağlıdır B ve B örtük olarak bağlıdır A .

son örnek

Numaralandırma üyeleri, sınıflar içindeki alanlara tam olarak benzer şekilde adlandırılır ve kapsamına alınır. Bir sabit listesi üyesinin kapsamı, içeren sabit listesi türünün gövdesidir. Bu kapsamda, sabit listesi üyelerine basit adlarıyla başvurabilirsiniz. Diğer tüm kodlardan bir sabit listesi üyesinin adı, sabit listesi türü adıyla nitelenecektir. Sabit listesi üyelerinin herhangi bir bildirilen erişilebilirliği yoktur; bir sabit listesi üyesine, içeren sabit listesi türü erişilebilir durumdaysa erişilebilir.

19.5 System.Enum türü

Tür System.Enum , tüm sabit listesi türlerinin soyut temel sınıfıdır (bu, sabit listesi türünün temel alınan türünden farklıdır) ve öğesinden devralınan System.Enum üyeler herhangi bir sabit listesi türünde kullanılabilir. Herhangi bir numaralandırma türünden öğesine bir kutulama dönüştürmesi (§10.2.9) ve herhangi bir sabit listesi türünden System.Enum System.Enumgelen bir kutu açma dönüştürmesi (§10.3.7) vardır.

System.Enum Bunun kendisi bir enum_type olmadığını unutmayın. Bunun yerine, tüm enum_type türetildiği bir class_type. Türü System.Enum , türünden System.ValueType devralan (§8.3.2) türünden objectdevralır. Çalışma zamanında, türdeki bir değer veya herhangi bir sabit listesi türünde System.Enum kutulanmış değere başvuru olabilir null .

19.6 Sabit listesi değerleri ve işlemleri

Her sabit listesi türü ayrı bir tür tanımlar; bir sabit listesi türü ile tam sayı türü arasında veya iki sabit listesi türü arasında dönüştürmek için açık bir numaralandırma dönüştürmesi (§10.3.3) gerekir. Sabit listesi türünün değer kümesi, temel alınan türün değer kümesiyle aynıdır ve adlandırılmış sabitlerin değerleriyle sınırlı değildir. Bir numaralandırmanın temel türündeki herhangi bir değer, sabit listesi türüne atanabilir ve bu sabit listesi türünün ayrı geçerli bir değeridir.

Numaralandırma üyeleri, içeren sabit listesi türlerinin türüne sahiptir (diğer sabit listesi üyesi başlatıcıları dışında: bkz . §19.4). İlişkili değere sahip sabit listesi türünde E bildirilen bir sabit listesi üyesinin değeridir(E)vv.

Aşağıdaki işleçler sabit listesi türlerinin değerlerinde kullanılabilir:

Her sabit listesi türü otomatik olarak sınıfından System.Enum türetilir (sırayla ve objectöğesinden System.ValueType türetilir). Bu nedenle, bu sınıfın devralınan yöntemleri ve özellikleri bir sabit listesi türündeki değerlerde kullanılabilir.