我试图创建一个通用的方法将转换Option<TEnum>
为Nullable<int>
:
let toNullableInt (value : Option<'T>) =
if value.IsSome then Nullable(int value.Value) else Nullable()
编译器推断这是一个 Option<int> -> Nullable<int>
是否可以添加约束,'T
以便我可以将其用于枚举?
这是可能的(种类如下):
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] 删除。
我来说两句