Enumeraciones
Las enumeraciones son tipos enteros en los que las etiquetas se asignan a un subconjunto de los valores. Se pueden usar en lugar de los literales para que el código sea más fácil de leer y mantener.
Sintaxis
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
Observaciones
Una enumeración es muy similar a una unión discriminada que tiene valores simples, salvo que se pueden especificar los valores. Los valores suelen ser enteros que comienzan en 0 o 1, o enteros que representan posiciones de bits. Si una enumeración está pensada para representar posiciones de bits, también debe usar el atributo Flags .
El tipo subyacente de la enumeración se determina a partir del literal que se usa, de modo que, por ejemplo, puede usar literales con un sufijo, como 1u
, 2u
, etc., para un tipo entero sin signo (uint32
).
Al hacer referencia a los valores con nombre, debe usar el nombre del propio tipo de enumeración como calificador, es decir, enum-name.value1
, no solo value1
. Este comportamiento difiere del de las uniones discriminadas. Esto se debe a que las enumeraciones siempre tienen el atributo RequireQualifiedAccess.
El código siguiente muestra la declaración y el uso de una enumeración.
// Declaration of an enumeration.
type Color =
| Red = 0
| Green = 1
| Blue = 2
// Use of an enumeration.
let col1: Color = Color.Red
Puede convertir fácilmente las enumeraciones al tipo subyacente mediante el operador adecuado, como se muestra en el código siguiente.
// Conversion to an integral type.
let n = int col1
Los tipos enumerados pueden tener uno de los siguientes tipos subyacentes: sbyte
, byte
, int16
, uint16
int32
uint32
int64
uint64
y char
. Los tipos de enumeración se representan en .NET Framework como tipos heredados de System.Enum
, que a su vez se heredan de System.ValueType
. Por lo tanto, son tipos de valor que se encuentran en la pila o en línea en el objeto contenedor, y cualquier valor del tipo subyacente es un valor válido de la enumeración. Esto es importante cuando el patrón coincide en los valores de enumeración, ya que tiene que proporcionar un patrón que detecta los valores sin nombre.
La función enum
de la biblioteca de F# se puede usar para generar un valor de enumeración, incluso un valor distinto de uno de los valores predefinidos con nombre. Puede utilizar la función enum
de la manera siguiente:
let col2 = enum<Color> (3)
La función predeterminada enum
funciona con el tipo int32
. Por lo tanto, no se puede usar con tipos de enumeración que tienen otros tipos subyacentes. En su lugar, utilice lo siguiente.
type uColor =
| Red = 0u
| Green = 1u
| Blue = 2u
let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)
Además, los casos de enumeraciones siempre se emiten como public
. Esto es para que se alineen con C# y con el resto de la plataforma .NET.