Compartir vía


Enumeraciones

Las enumeraciones, también conocidas como enumeraciones, son tipos enteros en los que las etiquetas se asignan a un subconjunto de los valores. Puede usarlos en lugar de literales para que el código sea más legible y fácil de mantener.

Sintaxis

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

Observaciones

Una enumeración tiene un aspecto 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, int16uint16, int32, uint32, , int64, uint64y 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 significativo cuando se realiza un emparejamiento de patrones con valores de enumeración, ya que tiene que proporcionar un patrón que intercepte los valores no nombrados.

La enum función 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. Use la enum función como se indica a continuación.

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 tengan otros tipos subyacentes. En su lugar, use 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 el símbolo public. Esto es para que se alineen con C# y el resto de la plataforma .NET.

Para habilitar la coincidencia exhaustiva solo para los casos de enumeración definidos, puede suprimir la advertencia FS0104 mediante la directiva #nowarn "104". Esto permite al compilador tratar solo los valores de enumeración declarados como válidos durante la coincidencia de patrones, evitando la necesidad de un caso por defecto, lo cual es útil cuando estás seguro de que todos los valores están cubiertos.

La advertencia FS0104 (Enums may take values outside known cases.) existe porque las enumeraciones se pueden asignar valores subyacentes arbitrarios, por ejemplo, directamente o como resultado de operaciones bit a bit.

Consulte también