列挙型は、enumとしても知られる整数型で、値のサブセットにラベルが割り当てられるものです。 リテラルの代わりにこれらを使用して、コードをより読みやすく保守しやすくすることができます。
構文
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
注釈
列挙体は、値を指定できる点を除き、単純な値を持つ判別共用体に似ています。 値は通常、0 または 1 から始まる整数、またはビット位置を表す整数です。 列挙体がビット位置を表すことを意図している場合は、 Flags 属性も使用する必要があります。
列挙型の基になる型は、使用されるリテラルから決定されるため、たとえば、符号なし整数 (1u
) 型に対して、2u
、uint32
などのサフィックスを持つリテラルを使用できます。
名前付き値を参照する場合は、列挙型自体の名前を修飾子として使用する必要があります。つまり、enum-name.value1
だけでなく、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
、 uint64
、 char
) のいずれかを使用できます。 列挙型は、.NET Framework では、 System.Enum
から継承される型として表され、 System.ValueType
から継承されます。 したがって、これらはスタック上にある値型または包含オブジェクト内のインライン型であり、基になる型の値は列挙型の有効な値です。 これは、名前のない値をキャッチするパターンを指定する必要があるため、列挙値のパターン マッチングの場合に重要です。
F# ライブラリの enum
関数を使用すると、定義済みの名前付き値の 1 つ以外の値であっても、列挙値を生成できます。
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 プラットフォームの残りの部分と一致するようにするためです。
定義されている列挙型のケースに対してのみ 完全一致 を有効にするには、ディレクティブ #nowarn "104"
を使用して警告 FS0104 を抑制できます。 これにより、コンパイラは、宣言された列挙型の値のみをパターン マッチング中に有効として扱うことができます。すべての値がカバーされていることを確認する場合に役立ちます。キャッチオール ケースは不要です。
警告 FS0104 (Enums may take values outside known cases.
) は存在します。列挙型には、たとえば、直接または ビットごとの演算の結果として、任意の基になる値を割り当てることができます。
こちらも参照ください
.NET