列挙Enumerations

列挙型とも呼ばれる列挙体は、値のサブセットにラベルが割り当てられる整数型です。Enumerations, also known as enums, , are integral types where labels are assigned to a subset of the values. リテラルの代わりに使用すると、コードの読み取りおよび保守が容易になります。You can use them in place of literals to make code more readable and maintainable.

構文Syntax

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

RemarksRemarks

列挙体は、値を指定できる点を除いて、単純な値を持つ判別共用体とよく似ています。An enumeration looks much like a discriminated union that has simple values, except that the values can be specified. 値は通常、0または1から始まる整数、またはビット位置を表す整数です。The values are typically integers that start at 0 or 1, or integers that represent bit positions. 列挙体がビット位置を表すことを目的としている場合は、 Flags属性も使用する必要があります。If an enumeration is intended to represent bit positions, you should also use the Flags attribute.

列挙型の基になる型は、使用されるリテラルから決定されます。したがって、たとえば1u、、 2uなどのサフィックスでリテラルを使用して、符号なし整数 (uint32) 型にすることができます。The underlying type of the enumeration is determined from the literal that is used, so that, for example, you can use literals with a suffix, such as 1u, 2u, and so on, for an unsigned integer (uint32) type.

名前付きの値を参照する場合は、列挙型自体の名前を修飾子として使用する必要がありenum-name.value1ます。これvalue1は、だけではありません。When you refer to the named values, you must use the name of the enumeration type itself as a qualifier, that is, enum-name.value1, not just value1. この動作は、判別共用体の動作とは異なります。This behavior differs from that of discriminated unions. これは、列挙体には常にRequireQualifiedAccess属性が含まれているためです。This is because enumerations always have the RequireQualifiedAccess attribute.

次のコードは、列挙体の宣言と使用方法を示しています。The following code shows the declaration and use of an enumeration.

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

次のコードに示すように、適切な演算子を使用して、列挙型を基になる型に簡単に変換できます。You can easily convert enumerations to the underlying type by using the appropriate operator, as shown in the following code.

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

列挙sbyte型はbyte 、、charuint16int32 、、uint32、、、、およびのいずれかの基になる型を持つことができます。 int64 int16 uint16 uint64Enumerated types can have one of the following underlying types: sbyte, byte, int16, uint16, int32, uint32, int64, uint16, uint64, and char. 列挙型は、からSystem.Enum継承される型として .NET Framework で表されます。これは、からSystem.ValueType継承されます。Enumeration types are represented in the .NET Framework as types that are inherited from System.Enum, which in turn is inherited from System.ValueType. したがって、これらは、スタックに配置されている値型、または親オブジェクトのインラインにある値型であり、基になる型の値は列挙体の有効な値です。Thus, they are value types that are located on the stack or inline in the containing object, and any value of the underlying type is a valid value of the enumeration. これは、名前のない値をキャッチするパターンを指定する必要があるため、列挙値でパターンマッチングを行う場合に非常に重要です。This is significant when pattern matching on enumeration values, because you have to provide a pattern that catches the unnamed values.

enum関数の F# ライブラリで使用できます、定義済みの以外の値も、列挙値を生成する名前付きの値。The enum function in the F# library can be used to generate an enumeration value, even a value other than one of the predefined, named values. 関数は次enumのように使用します。You use the enum function as follows.

let col2 = enum<Color>(3)

既定enumの関数は、型int32で動作します。The default enum function works with type int32. そのため、基になるその他の型を持つ列挙型では使用できません。Therefore, it cannot be used with enumeration types that have other underlying types. 代わりに、次のものを使用します。Instead, use the following.

type uColor =
   | Red = 0u
   | Green = 1u
   | Blue = 2u
let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)

さらに、列挙型のケースは常publicにとして出力されます。Additionally, cases for enums are always emitted as public. これは、とその他のC# .net プラットフォームとの連携を行うためのものです。This is so that they align with C# and the rest of the .NET platform.

関連項目See also