我正在以'a option when 'a :> IBaseType的形式获得一些计算的结果。有一个从IBaseType派生的类型树,我真的不知道这是什么特定类型的选项,但是重要的是它是特定派生的选项,而不是基本类型。因此,我想将其上传到IBaseType option进行进一步处理。由于option是泛型类型,因此不可能直接进行强制转换(在F#中),而我必须在Option.map内部进行强制转换。没什么复杂的,类型推断可以按预期工作...

中间强制转换选项也可以按预期解决...

直到功能完成。由于某种原因,此时类型推断决定原始选项必须已经是IBaseType option类型:


中间类型早已得到解决,为什么它决定重新分配op的推断类型?确保这会导致运行时异常。看起来像编译器错误,但是主要规则是编译器中没有错误。

因此,最后听起来真的很愚蠢:我不知道如何简单地转换简单选项。为了使画面更清晰:processResultIBaseType 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)

10-07 19:43
查看更多