Vasily
А обратный?
Ayrat
При условии, что на входе enum<'u>
let inline foo<'a, 'b when 'a: enum<'b> and 'b: (static member op_Explicit: 'b -> int32)> (x: 'a) = (# "conv.i4" x : int32 #)
Vasily
conv.i8 жи тоже есть?
Ayrat
А обратный?
enum<SomeEnum> 1
Vasily
А если он не интовый?
Ayrat
А если он не интовый?
https://github.com/fsharp/fsharp/blob/24c798bfcee5d6f91ae2c19888baeb9946744c3a/src/fsharp/FSharp.Core/prim-types.fs#L2299
Ayrat
(retype value : 'Enum)
Ayrat
короче, сейф путь с возможным боксингом  EnumOfValue ансейв - ретайп с хардкастом
Vasily
unboxPrim<'Enum>(box value)
Vasily
???
Ayrat
???
???
Ayrat
Там ретайп ещё есть Карл
Vladislav
же
Vasily
retype мне зачем?
Vasily
Ну дай обратный каст из int64
Ayrat
(# "conv.ovf.i8" value : int64 #)
Ayrat
Из знакового значения
Vasily
Для целочисленных схавает, как я понимаю
Ayrat
https://github.com/fsharp/fsharp/blob/24c798bfcee5d6f91ae2c19888baeb9946744c3a/src/fsharp/FSharp.Core/prim-types.fs#L4550
Ayrat
Ты можешь чекануть
Vladislav
Бокс инта с последующим анбоксом int64 работает?
[<RequireQualifiedAccess>] module Enum = let inline ToValue< ^T, ^E when 'T: enum< ^E>> (v: int64): ^E = (# "" v : ^E #) type Test = | A = 1 | B = 2 [<EntryPoint>] let main argv = let en = Enum.ToValue<Test, _> 1L 0 // return an integer exit code
Roman
|> Async.AwaitTask |> Async.RunSynchronously как вам?)
Vasily
Норм
Vasily
@omgszer , как вытащить unboxPrim?
Roman
ну если уж решил забить хер и сделать блокирующий вызов, то можно тупо myTask.Result сделать. Либо Task.Wait вызвать
Ilya
Просто мне скоро придётся дёргать асинки шарповые, а у Влашина статьи про работу с тасками нету :(
Roman
непонятно, нахуя сначала в асинк конвертить, чтобы потом все заблочить
Ayrat
Vasily
Я хочу закастить int64 к enum<'u>
Vasily
Такую ебаную магию можно сделать?
Roman
Просто мне скоро придётся дёргать асинки шарповые, а у Влашина статьи про работу с тасками нету :(
если тебе надо работать с тасками, тут есть 2 варианта: - Async.AwaitTask - TaskBuilder.fs Если тебе надо только с тасками работать, и работа с ними простая (т.е. даже отменять не надо, просто чейнить одну за другой), то лучше взять таск билдер и асинки вообще не трогать.
Vladimir
ну дык EnumToValue
оно сокрыто)
Vladimir
но можно же Ctrl+C метод применить
Ayrat
Я хочу закастить int64 к enum<'u>
https://sharplab.io/#v2:DYLgZgzgNAJiDUAfA9gBwKYDsAEBZAlgMYBOyEyYALgHQBiAygBYCGxq1AwssetQDLNMAcwCuzIegAKxfAFt8lfADd0EALAAoTbOQwRwdNgCC2ALzZNm7NkoBPDNgCiZixuvXETlwEY+lt9gGlNjMIF7mjpgisgDyYABqzMAihr5WgejBAEZh+JiUAGwALC6R0QAqyInJhsxAA==
Ayrat
оно сокрыто)
ну да, аж надо целый модуль открыть)))
Vasily
Ненене
Vasily
type E=| E=1
Ayrat
type E=| E=1
Ну и чо?
Ayrat
Я нихуя не понял
Ayrat
Ты какими-то загадками говоришь
Vasily
Ну у тебя в общем виде есть enum<'u>
Vasily
Так?
Ayrat
Допустим
Vladimir
ну да, аж надо целый модуль открыть)))
да, недостаточно долго держал мышку чтобы вылез попапчик)
Vasily
Который я хочу сохранить в базу
Vasily
'u у нас целочисленное
Vasily
Кроме байта вроде
Vasily
Хотя байт тоже
Vasily
Дык вот
Ayrat
Ок, допустим
Vasily
По идее нужна функция enum<'u> -> int64
Vasily
int64->enum<'u>
Ayrat
Vasily
Какой магией?
Vasily
(# "" v : int64 #)?
Vasily
И (# "" v : enum<'u> #) соответственно?
Ayrat
Ну нет. Ща
Vasily
В целом, наверное, можно через указатели
Vladislav
я лично голову сломал об это
Vladimir
там есть Enum.GetUnderlyingType у энама
Vladimir
в него и кастить, а потом EnumOfValue
Vasily
И чем же он мне поможет?
Ayrat
В целом, наверное, можно через указатели
let inline toInt64<'a, 'b when 'a: enum<'b>> (a: 'a) = // enum<'b> -> int64 (# "conv.ovf.i8" a : int64 #) let inline fromInt64< ^a, ^b when ^a : enum< ^b> // int64 -> enum<'b> and (^b): (static member op_Explicit: int64 -> ^b)> (a: int64) = let b = (^b: (static member op_Explicit: int64 -> ^b) a) (EnumOfValue b): 'a
Vasily
Хммм
Ayrat
Второе не сработает, надо ретайп
Ayrat
https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AbEAzAzmgExAGoAfAWwgIFcMYACAQXoF4BYAKHvroBd6AlgDsMwhrwgBJIb1QAeAOQBDNPQXB6AdwAWMIWqUh6e6uUXAAfBfoAKQwYCUregHoXxoafPW414bJRObm4bAGJ6ACJIIQA3ADoIGOw4gQAOCPoleiN/VHpQh04gnhh+YVEhBmwoCHJpAMUYazscmVQnFnpikPCIjKyjBQYC7q6uYNHi3gBPAAcGSWdFzoBGKbmGABlnbc6AJk31+foAIWczzoBmamni4r5BPM6JerybSTjJQvGHjCf6F5tFC2TZxTbfbgPYD/QEBWwnOInCFjbj3UqCIzLejVWqvYECVBo/hYei7bE1OpAniEn7o0CnZw4ylw6GBcbFWZQfzYfQRACkjAyAg5XJkPMiAoyGBF3N5kvowCAA===
Ayrat
ансейф код
Ayrat
но я думаю вы знаете что делаете
Ayrat
он даже работает в рантайме
Ayrat
но если вы попытаетесь скастить что-то не то, у вас слр немного упадёт
Vasily
Ну так и сделал примерно
Roman
ох ебааааать
Roman
помните, я скидывал ебанутую простыню регистраций всякой хуйни для жсона?