Тип элемента перечисления - PullRequest
3 голосов
/ 05 июля 2019

Я думаю, что у меня довольно простой вопрос, но я не могу найти информацию о нем.Так, например, в c # я могу определить типы значений enum, используя наследование, например:

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

    [Description("Status")]
    SERVICE1 = 0x0001
}

Но как бы я это сделал в F #, пока я перевожу это как:

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

Iпытался использовать наследование и пытался определить тип перед значением, например

Unknown = uint16 0u

Но я получаю ошибку компиляции, так возможно ли это?

1 Ответ

5 голосов
/ 05 июля 2019

Преобразование значений, не являющихся int32, в enum задокументировано в Перечисления :

Функция по умолчанию enum работает с типом int32. Следовательно, его нельзя использовать с типами перечисления, которые имеют другие базовые типы. Вместо этого используйте следующее.

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

Таким образом, вы бы сделали:

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

Или, если вы предпочитаете:

let service : RequestedService = EnumOfValue 0u // Or 1u or whatever

Подробнее см .: LanguagePrimitives.EnumOfValue <'T,' Enum> Функция .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...