Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

14.3Члены перечисления

Тело объявления перечисляемого типа определяет нуль или более членов перечисления, которые являются именованными константами перечисляемого типа. Два члена не могут иметь одинаковое имя.

объявления_членов_перечисления: объявление_члена_перечисления объявления_членов_перечисления , объявление_члена_перечисления

объявление_элемента_перечисления: атрибутынеобязательно идентификатор атрибутынеобязательно идентификатор = константное_выражение

Каждый член перечисления имеет связанное с ним постоянное значение. Тип этого значения является базовым типом для содержащего его перечисления. Постоянное значение для каждого члена перечисления должно находиться в диапазоне базового типа для перечисления. Например:

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

приводит к ошибке времени компиляции, так как значения констант -1, -2 и -3 не находятся в диапазоне базового целого типа uint.

Несколько членов перечисления могут совместно использовать одно и то же связанное значение. Например:

enum Color { Red, Green, Blue,

Max = Blue }

Здесь показано перечисление, в котором два его члена — Blue и Max — имеют одно и то же связанное значение.

Связанное значение члена перечисления присваивается явно или неявно. Если объявление члена перечисления имеет инициализатор константного_выражения, значение этого константного выражения, неявно преобразованное в базовый тип перечисления, является связанным значением члена перечисления. Если в объявлении члена перечисления нет инициализатора, его связанное значение устанавливается неявно следующим образом:

  • если член перечисления является первым членом перечисления, объявленным в перечисляемом типе, его связанное значение равно нулю;

  • в противном случае связанное значение члена перечисления получается увеличением на единицу связанного значения предшествующего ему в тексте члена перечисления. Это увеличенное значение должно находиться в диапазоне значений, который может быть представлен базовым типом, иначе возникает ошибка времени компиляции.

Пример:

using System;

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 String.Format("Red = {0}", (int) c);

case Color.Green: return String.Format("Green = {0}", (int) c);

case Color.Blue: return String.Format("Blue = {0}", (int) c);

default: return "Invalid color"; } } }

Здесь выводятся на печать имена членов перечисления и их связанные значения. Результат выполнения примера:

Red = 0 Green = 10 Blue = 11

по следующим причинам:

  • члену перечисления Red автоматически присваивается значение нуль (так как у него нет инициализатора и он является первым членом перечисления);

  • члену перечисления Green явно присваивается значение 10;

  • а члену перечисления Blue автоматически присваивается значение на единицу большее, чем у члена, предшествующего ему в тексте.

Связанное значение члена перечисления не может, прямо или косвенно, использовать значение его собственного связанного члена перечисления. За исключением этого ограничения зацикливания, инициализаторы членов перечисления могут свободно ссылаться на другие инициализаторы членов перечисления, независимо от их положения в тексте. В инициализаторе члена перечисления значения других членов перечисления всегда обрабатываются как имеющие тип их базового типа, так что не требуются приведения к типу при ссылке на другие члены перечисления.

Например:

enum Circular { A = B, B }

приводит к ошибке времени компиляции, так как объявления A и B являются циклическими. Член A зависит от B явно, а член B зависит от A неявно.

Члены перечисления именуются и имеют область видимости совершенно аналогично полям в классах. Областью видимости члена перечисления является тело содержащего его перечисляемого типа. В этой области видимости на члены перечисления можно ссылаться по их простому имени. Из всего остального кода имя члена перечисления должно уточняться именем его перечисляемого типа. У членов перечисления нет какой-либо объявленной доступности — член перечисления доступен, если доступен содержащий его перечисляемый тип.

14.4Тип System.Enum

Тип System.Enum — это абстрактный базовый класс всех перечисляемых типов (он является особым и отличным от базового типа перечисляемого типа), и члены, унаследованные от System.Enum, доступны в любом перечисляемом типе. Преобразование упаковки (§4.3.1) возможно из любого перечисляемого типа в тип System.Enum, а также возможно преобразование распаковки (§4.3.2) из типа System.Enum в любой перечисляемый тип.

Обратите внимание, что сам System.Enum не является перечисляемым_типом. Скорее, это тип_класса, из которого производятся все перечисляемые_типы. Тип System.Enum наследует от типа System.ValueType (§4.1.1), который, в свою очередь, наследует от типа object. Во время выполнения значение типа System.Enum может быть равно null или являться ссылкой на упакованное значение любого перечисляемого типа.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]