Перечисления в системе общих типов CTS

Обновлен: Ноябрь 2007

Перечисление (enum) является особым типом значений, который наследуется от System.Enum и предоставляет альтернативные имена для значений базового простого типа. Тип перечисления имеет имя, базовый тип и набор полей. Базовый тип должен быть одним из встроенных целочисленных типов со знаком или без (например, Byte, Int32 или UInt64). Поля являются статическими полями литералов, каждое из которых представляет константу. Одно значение можно присвоить нескольким полям. При этом необходимо отметить одно значение как первичное значение перечисления для отражения и преобразования строк.

Значение базового типа можно присвоить перечислению и наоборот (среда выполнения не требует приведения типов). Можно создать экземпляр перечисления и вызывать методы System.Enum, а также любые методы, определенные в базовом типе перечисления. Однако в некоторых языках передача перечисления в качестве параметра может не допускаться, когда требуется экземпляр базового типа, или наоборот.

К перечислениям применяются следующие дополнительные ограничения.

  • В них нельзя определять собственные методы.

  • В них нельзя реализовывать интерфейсы.

  • В них нельзя определять свойства и события.

  • Перечисление может быть универсальным, только если оно является универсальным, поскольку вложено в универсальный тип. То есть перечисления не могут иметь свои собственные параметры типов.

    6e3t9w21.alert_note(ru-ru,VS.90).gifПримечание.

    Вложенные типы (включая перечисления), созданные в Visual Basic, C# и C++, включают параметры типов всех включающих их общих типов и, таким образом, являются универсальными даже в том случае, если они не имеют своих собственных параметров типов. Дополнительные сведения см. в разделе "Вложенные типы" в MakeGenericType.

    Можно объявить универсальное перечисление на языке MSIL, но при попытке использовать это перечисление возникает TypeLoadException.

Атрибут Флаги обозначает специальный вид перечисления, называемый битовым полем. Среда выполнения (в отличие от языка программирования) не различает обычные перечисления и битовые поля. Если это отличие обнаружено, для создания неименованных значений в битовых полях можно использовать битовые операторы (в перечислениях их использовать нельзя). Перечисления обычно используются для списков уникальных элементов, например дней недели, названий стран или областей и т. д. Битовые поля обычно используются для списков количеств и качеств, которые могут возникать в таких комбинациях, как Red And Big And Fast.

В следующем примере показан способ использования битовых полей и обычных перечислений.

Imports System
Imports System.Collections

' A traditional enumeration of some root vegetables.
Public Enum SomeRootVegetables
    HorseRadish
    Radish
    Turnip
End Enum 'SomeRootVegetables

' A bit field or flag enumeration of harvesting seasons.
<Flags()> Public Enum Seasons
   None = 0
   Summer = 1
   Autumn = 2
   Winter = 4
   Spring = 8
   All = Summer Or Autumn Or Winter Or Spring
End Enum 'Seasons

' Entry point.
Public Class EnumerationSample
    
    Public Shared Sub Main()
        ' Hash table of when vegetables are available.
        Dim AvailableIn As New Hashtable()
        
        AvailableIn(SomeRootVegetables.HorseRadish) = Seasons.All
        AvailableIn(SomeRootVegetables.Radish) = Seasons.Spring
        AvailableIn(SomeRootVegetables.Turnip) = Seasons.Spring Or _
            Seasons.Autumn
        
        ' Array of the seasons, using the enumeration.
        Dim MySeasons() As Seasons = {Seasons.Summer, Seasons.Autumn, _
            Seasons.Winter, Seasons.Spring}
        
        ' Print information of what vegetables are available each season.
        Dim i As Integer
        For i = 0 To MySeasons.Length - 1
            Console.WriteLine( _
                "The following root vegetables are harvested in " _
                & MySeasons(i).ToString("G") & ":")
            Dim e As DictionaryEntry
            For Each e In AvailableIn
                ' A bitwise comparison.
                If(CType(e.Value, Seasons) And MySeasons(i)) > 0 Then
                    Console.WriteLine("  " & _
                        CType(e.Key, SomeRootVegetables).ToString("G"))
                End If
            Next e
        Next i
    End Sub 'Main
End Class 'EnumerationSample
using System;
using System.Collections;

// A traditional enumeration of some root vegetables.
public enum SomeRootVegetables
{
    HorseRadish,
    Radish,
    Turnip
}

// A bit field or flag enumeration of harvesting seasons.
[Flags]
public enum Seasons
{
    None = 0,
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
    All = Summer | Autumn | Winter | Spring
}

// Entry point.
public class EnumerationSample
{
    public static void Main()
    {
        // Hash table of when vegetables are available.
        Hashtable AvailableIn = new Hashtable();

        AvailableIn[SomeRootVegetables.HorseRadish] = Seasons.All;
        AvailableIn[SomeRootVegetables.Radish] = Seasons.Spring;
        AvailableIn[SomeRootVegetables.Turnip] = Seasons.Spring | 
            Seasons.Autumn;

        // Array of the seasons, using the enumeration.
        Seasons[] seasons = new Seasons[] { Seasons.Winter, Seasons.Spring, 
            Seasons.Summer, Seasons.Autumn };

        // Print information of what vegetables are available each season.
        for (int i = 0; i < seasons.Length; i++)
        {
            Console.WriteLine(
                "The following root vegetables are harvested in "
                + seasons[i].ToString("G") + ":");
            foreach (DictionaryEntry e in AvailableIn)
            {
                // A bitwise comparison.
                if (((Seasons)e.Value & seasons[i]) > 0)
                    Console.WriteLine("  " +
                        ((SomeRootVegetables)e.Key).ToString("G"));
            }
        }
    }
}

Результат выполнения этой программы выглядит следующим образом.

The following root vegetables are harvested in Summer:
  HorseRadish
The following root vegetables are harvested in Autumn:
  Turnip
  HorseRadish
The following root vegetables are harvested in Winter:
  HorseRadish
The following root vegetables are harvested in Spring:
  Turnip
  Radish
  HorseRadish

См. также

Основные понятия

Типы значений в системе общих типов CTS

Общие сведения о библиотеке классов .NET Framework

Ссылки

System.ValueType

System.Enum

Другие ресурсы

Система общих типов CTS