我正在以'a option when 'a :> IBaseType
的形式获得一些计算的结果。有一个从IBaseType
派生的类型树,我真的不知道这是什么特定类型的选项,但是重要的是它是特定派生的选项,而不是基本类型。因此,我想将其上传到IBaseType option
进行进一步处理。由于option是泛型类型,因此不可能直接进行强制转换(在F#中),而我必须在Option.map内部进行强制转换。没什么复杂的,类型推断可以按预期工作...
中间强制转换选项也可以按预期解决...
直到功能完成。由于某种原因,此时类型推断决定原始选项必须已经是IBaseType option
类型:
中间类型早已得到解决,为什么它决定重新分配op
的推断类型?确保这会导致运行时异常。看起来像编译器错误,但是主要规则是编译器中没有错误。
因此,最后听起来真的很愚蠢:我不知道如何简单地转换简单选项。为了使画面更清晰:processResult
以IBaseType option
作为参数。这是麻烦的功能的来源:
(fun (x: obj) ->
let op = x :?> _ option
let upcastOp = op |> Option.map (fun y -> y :> IBaseType)
upcastOp |> processResult)
有什么想法如何处理吗?
最佳答案
我不知道如何在这里推断op
的类型。
但是我很确定,如果您不能按照kvb的建议将x
的类型更改为IBaseType option
,则确实必须使用反射。
一种基于反射的替代解决方案:
let f (x:obj) =
match x with
| null -> None // x is None
| _ -> match x.GetType().GetProperty("Value") with
| null -> None // x is not an option
| prop ->
let v = prop.GetValue( x, null )
Some (v :?> IBaseType)