共通型システムの列挙型

更新 : 2007 年 11 月

列挙型 (enum) は特別な形式の値型で、System.Enum から継承され、基になるプリミティブ型の値に対して別名を割り当てます。列挙型には、名前、基になる型、およびフィールドのセットがあります。基になる型は、組み込みの符号付きまたは符号なし整数型 (ByteInt32UInt64 など) であることが必要です。フィールドは静的リテラル フィールドで、各フィールドが 1 つの定数を表します。複数のフィールドに同じ値を割り当てることもできます。その場合は、リフレクションや文字列変換を行うために、いずれかの値をプライマリ列挙値としてマークしておく必要があります。

基になる型の値を列挙型に割り当てることも、その逆も可能です (キャストは必要ありません)。列挙型のインスタンスを作成し、System.Enum のメソッドや、その列挙型の基となる型に定義されている任意のメソッドを呼び出すことができます。しかし、言語によっては、基になる型のインスタンスが必要とされるときに、列挙型をパラメータとして渡すこと (またはその逆) が許可されていない場合もあります。

また、列挙型には次のような制限があります。

  • 独自のメソッドは定義できません。

  • インターフェイスを実装できません。

  • プロパティまたはイベントを定義できません。

  • 列挙型は、ジェネリック型に入れ子にされているという理由でジェネリックである場合を除き、ジェネリックにはなりません。つまり、列挙型は、独自の型パラメータを持つことができません。

    メモ :

    Visual Basic、C#、および C++ で作成された入れ子にされた型 (列挙型など) は、それを囲むすべてのジェネリック型の型パラメータを含みます。したがって、独自の型パラメータは持ちませんがジェネリックです。詳細については、MakeGenericType の「入れ子にされた型」を参照してください。

    Microsoft Intermediate Language (MSIL) アセンブリ言語でジェネリック列挙体を宣言することは可能ですが、この列挙体を使おうとすると TypeLoadException が発生します。

Flags 属性は、ビット フィールドと呼ばれる特別な種類の列挙型を表します。ランタイム自体は通常の列挙型とビット フィールドを区別しませんが、言語の中にはそれらを区別するものもあります。列挙型とビット フィールドが区別される場合、ビット フィールドではビットごとの演算子を使用して名前のない値を生成できますが、列挙型ではビットごとの演算子は使用できません。通常、列挙型は、曜日、国名、地域名などの一意の要素のリストに使用されます。通常、ビット フィールドは、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

参照

概念

共通型システムの値型

.NET Framework クラス ライブラリの概要

参照

System.ValueType

System.Enum

その他の技術情報

共通型システム