列挙

"列挙型" は enum とも呼ばれ、値のサブセットにラベルが割り当てられる整数型です。 リテラルの代わりに使用すると、コードの読み取りおよび保守が容易になります。

構文

type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...

解説

列挙型は、値を指定できる点を除いて、単純な値を持つ判別共用体とよく似ています。 値は通常、0 または 1 から始まる整数、またはビット位置を表す整数です。 列挙型でビット位置を表す場合は、Flags 属性も使用する必要があります。

列挙型の基になる型は、使用されるリテラルから決定されます。したがって、たとえば、1u2u などのサフィックスを持つリテラルを、符号なし整数 (uint32) 型に使用することができます。

名前付きの値を参照する場合は、列挙型自体の名前を修飾子として使用する必要があります。つまり、value1 だけではなく enum-name.value1 です。 この動作は、判別共用体の動作とは異なります。 これは、列挙型には常に RequireQualifiedAccess 属性があるためです。

次のコードでは、列挙型の宣言と使用方法を示します。

// Declaration of an enumeration.
type Color =
    | Red = 0
    | Green = 1
    | Blue = 2
// Use of an enumeration.
let col1: Color = Color.Red

次のコードに示すように、適切な演算子を使用することで、列挙型を基になる型に簡単に変換できます。

// Conversion to an integral type.
let n = int col1

列挙される型は、次のいずれかの基になる型を持つことができます: sbytebyteint16uint16int32uint32int64uint64char。 列挙型は、.NET Framework では、System.Enum から継承される型として表されます。これは、さらに System.ValueType から継承されます。 したがって、これらは親オブジェクトのスタックまたはインラインに配置されている値型であり、基になる型の値は列挙型の有効な値です。 これは、列挙値でパターン マッチングを行う場合、名前のない値をキャッチするパターンを指定する必要があるため、非常に重要です。

F# ライブラリの enum 関数は、定義済みの名前付きの値のいずれか以外の値であっても、列挙値を生成するために使用できます。 enum 関数は次のように使用します。

let col2 = enum<Color> (3)

既定の enum 関数は、int32 型で動作します。 そのため、基になる型がそれ以外の列挙型では使用できません。 代わりに、以下を使用します。

type uColor =
    | Red = 0u
    | Green = 1u
    | Blue = 2u

let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)

さらに、列挙型のケースは常に public として出力されます。 これは、C# および .NET プラットフォームの他の部分と一致するようにするためです。

関連項目