f#强制枚举元素类型

Woj*_*icz 3 enums f#

我想我有一个相当简单的问题,但是我找不到有关它的任何信息。因此,例如在c#中,我可以使用继承定义值枚举类型:

public enum RequestedService : ushort
{
    [Description("Unknown")]
    Unknown = 0,

    [Description("Status")]
    SERVICE1 = 0x0001
}
Run Code Online (Sandbox Code Playgroud)

但是我将如何在F#中做到这一点,到目前为止,我将其翻译为:

type RequestedService =
    | [<Description("Unknown")>] Unknown = 0u
    | [<Description("Status")>] SERVICE1 = 0x0001u
Run Code Online (Sandbox Code Playgroud)

我尝试使用继承,并尝试在值之前定义类型,例如

Unknown = uint16 0u
Run Code Online (Sandbox Code Playgroud)

但是我遇到了编译错误,这可能吗?

dbc*_*dbc 5

枚举中记录了将非int32值转换为的enum情况:

默认enum功能与类型一起使用int32。因此,它不能与具有其他基础类型的枚举类型一起使用。而是,使用以下内容。

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

因此,您将执行以下操作:

open Microsoft.FSharp.Core.LanguagePrimitives

type RequestedService =
    | [<Description("Unknown")>] Unknown = 0u
    | [<Description("Status")>] SERVICE1 = 0x0001u

let service = EnumOfValue<uint32, RequestedService>(0u) // Or 1u or whatever
Run Code Online (Sandbox Code Playgroud)

或者,如果您喜欢:

let service : RequestedService = EnumOfValue 0u // Or 1u or whatever
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见:LanguagePrimitives.EnumOfValue <'T,'Enum>函数