let nrd = rd.NpgsqlReader
nrd.GetByte(nrd.GetOrdinal(name))
|> char
|> LanguagePrimitives.EnumOfValue
[<Struct>]
type ItemKind =
| Product = 'P'
[<CLIMutable>]
type Item =
{ Id : int64
Kind : ItemKind }
static member ofReader (rd: RowReader) =
{ Id = rd.int64 "id"
Kind = enumOfReader rd "kind" } (1)
Написал вот такое. Плохо ли, что в точке (1) не указан тип? Может ли это привести к проблемам в будущем?
очень маловероятно что это приведёт к проблемам в будущем, но публичное апи лучше всегда типизировать, это улучшает дебаг ошибок типизировать можно двумя способами - можно в сигнатуре функции написать - можно { RecordName.Id = rd.int64 "id" Kind = ... }
Просто enum работает только с int32
Это не совсем верное утверждение
Возможно мне ionide что-то не то показал
Пожалуй. Скорее только с числовыми, к которым char не относится https://github.com/dotnet/fsharp/blob/597446a4d3123316db356afcd205c49b05076642/src/fsharp/FSharp.Core/prim-types.fs#L4376-L4377
enum это CLRный уровень, F# лишь использует готовую инфру, enum в CLR только целые числа и поддерживает, разной размерности-byte, short, int
Я вообще не понял, что за enum в enum<int32>
Таки относится https://docs.microsoft.com/en-us/dotnet/api/system.typecode?view=net-6.0 > Char 4 An integral type
И все же я не нашел типа кроме int32, который принимает enum из prim-types. Ни uint32, ни int16, ни int64 не подходят. В сигнатуре то параметр строго int32
Обсуждают сегодня