列挙型 (F#)
列挙は、列挙としても知られ、ラベルが値のサブセットに割り当てられる整数型です。リテラルの代わりに使用すると、コードの読み取りおよび保守が容易になります。
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
解説
列挙型は、値を指定できる点を除いて、単純な値を持つ判別共用体によく似ています。通常、0 または 1 から始まる整数、またはビット位置を表す整数を指定します。ビット位置を表すように、列挙が使用される場合、 FlagsAttribute の属性を使用する必要があります。
列挙型の基になる型は、使用するリテラルによって決まります。したがって、符号なし整数型 (uint32) に対してサフィックス (1u、2u など) 付きのリテラルなどを使用できます。
名前付きの値を参照する場合は、修飾子として列挙型自体の名前を使用する必要があります。つまり、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
列挙型には、基になる型 (sbyte、byte、int16、uint16、int32、uint32、int64、uint16、uint64、および char) のいずれかを含めることができます。.NET Framework では、列挙型が、Enum から派生した型として表されます (Enum は ValueType から派生した型です)。したがって、列挙型は格納オブジェクトのスタックまたはインラインに格納される値型であり、基になる型のすべての値は列挙の有効な値です。これは列挙値に対してパターン マッチを行うときに重要なことであり、名前のない値を捕捉するパターンを指定する必要があります。
F# ライブラリの enum 関数を使用すると、列挙値を生成できます。定義されている名前付きの値以外の値も作成できます。enum 関数は、次のように使用します。
let col2 = enum<Color>(3)
既定の enum 関数では、int32 型が使用されます。したがって、enum 関数を、その他の基になる型を持つ列挙型と共に使用することはできません。代わりに、次の関数を使用します。
type uColor =
| Red = 0u
| Green = 1u
| Blue = 2u
let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)