F#将通用参数约束为枚举类型

塞弗林

我试图创建一个通用的方法将转换Option<TEnum>Nullable<int>

let toNullableInt (value : Option<'T>) =
   if value.IsSome then Nullable(int value.Value) else Nullable()

编译器推断这是一个 Option<int> -> Nullable<int>

是否可以添加约束,'T以便我可以将其用于枚举?

吉恩·贝利茨基(Gene Belitski)

这是可能的(种类如下):

let toNullableInt (v : Option<'T> when 'T:> Enum) =
    if v.IsSome then Nullable(v.Value |> unbox |> int) else Nullable()

快速检查确认确实:

type MyVals = 
| MyVal = 1000

MyVals.MyVal |> Option<MyVals>.Some |> toNullableInt
> 
val it : Nullable<int> = 1000

Option<MyVals>.None |> toNullableInt
> 
val it : Nullable<int> = null

不幸的是,这种方法无法解决枚举类型的实例可以具有未在枚举中定义的值的问题,以下表达式通过适当地转换某些Alien来说明int

enum</s><MyVals>10 |> Option<MyVals>.Some |> toNullableInt
> 
val it : Nullable<int> = 10

虽然您可能希望得到null...

更新:该问题的作者发现自己如何适应“未定义”枚举值的检查,我只是在下面从他的评论中摘录的最终解决方案下面进行了复制,以提高可见度:

let toNullableInt (v : Option<'T> when 'T:> Enum) =
    match v with
   | Some x when Enum.IsDefined (typeof<'T>, x) -> 
        Nullable(LanguagePrimitives.EnumToValue(x))
   | _ -> Nullable ()

给定的带有“ alien”枚举值输入的较早检查现在可以按预期运行:

enum<MyVals>10 |> Option<MyVals>.Some |> toNullableInt
>
val it : Nullable<int> = null

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章