の形式でいくつかの計算の結果を取得してい'a option when 'a :> IBaseType
ます。から派生した型のツリーがありIBaseType
、これがどの特定の型のオプションであるかはよくわかりませんが、重要なことは、それが特定の派生型のオプションであり、基本型ではないということです。だから私はIBaseType option
それをさらに処理するためにアップキャストしたい。オプションはジェネリック型であるため、(F# で) 直接キャストすることは不可能であり、Option.map 内でキャストする必要があります。複雑なことは何もなく、型推論は期待どおりに機能します...
中間のキャストされたオプションも期待どおりに解決されます...
関数が完了するまで。この時点で、何らかの理由で型推論により、元のオプションは既に type である必要があると判断されましたIBaseType option
。
中間型は以前に既に解決されていましたが、なぜ の推論された型を再割り当てすることにしたのop
ですか? 確かにこれは実行時例外につながります。コンパイラ エラーのように見えますが、主なルールはコンパイラにエラーがないことです。
結局、それは本当にばかげているように聞こえます。単純なオプションを単純にアップキャストする方法がわかりません。画像をわかりやすくするために、引数としてprocessResult
取りIBaseType option
ます。そして、ここに厄介な機能の原因があります:
(fun (x: obj) ->
let op = x :?> _ option
let upcastOp = op |> Option.map (fun y -> y :> IBaseType)
upcastOp |> processResult)
これに対処する方法はありますか?