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 }
,
Green
veBlue
üyeleriyleRed
adlı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 enum
baş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 char
integral türlerinden (§8.3.6) biri olmalıdır. Temel alınan tür bir integral_type
(§8.3.5) veya bir integral_type_name
tarafı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ığıylaintegral_type_name
temel 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
long
sahip bir sabit listesi bildirir.son örnek
Not: Geliştirici, örneğinde olduğu gibi, aralığında yer alan ancak aralığında olmayan
int
değerlerinlong
kullanımını etkinleştirmek veya bu seçeneği gelecekte korumak için temel alınan türünülong
kullanmayı 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
, sealed
ve 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
-2
türününuint
aralığı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
veMax
) 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ğeri10
verilir;- 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ırB
veB
örtük olarak bağlıdırA
.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.Enum
gelen 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 object
devralı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)v
v
.
Aşağıdaki işleçler sabit listesi türlerinin değerlerinde kullanılabilir:
==
,!=
,<
,>
,<=
, (>=
§12.12.6)- ikili
+
(§12.10.5) - ikili
-
(§12.10.6) ^
,&
,|
(§12.13.3)~
(§12.9.5)++
,--
(§12.8.15 ve §12.9.6)sizeof
(§23.6.9)
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.
ECMA C# draft specification