Como fazer o downcast de obj para a opção <obj>?
Tenho uma função que aceita um parâmetro do tipo objeto e precisa fazer o downcast para umoption<obj>
.
member s.Bind(x : obj, rest) =
let x = x :?> Option<obj>
Se eu passar (por exemplo) umOption<string>
Comox
, a última linha lança a exceção:Não foi possível converter o objeto do tipo 'Microsoft.FSharp.Core.FSharpOption'1 [System.String]' para digitar 'Microsoft.FSharp.Core.FSharpOption'1 [System.Object]'.
Ou, se eu tentar um teste de tipo:
member s.Bind(x : obj, rest) =
match x with
| :? option<obj> as x1 -> ... // Do stuff with x1
| _ -> failwith "Invalid type"
entãox
nunca combinaoption<obj>
.
Para fazer isso funcionar, atualmente eu tenho que especificar o tipo que a opção contém (por exemplo, se a função receber umaoption<string>
, e eu abaixei o parâmetro para isso em vez deoption<obj>
, a função funcion
Existe uma maneira de baixar o parâmetro paraoption<obj>
sem especificar que tipo de opção contém? Eu tenteioption<_>
, option<#obj>
eoption<'a>
com os mesmos resultados.
Por meio do plano de fundo, o parâmetro precisa ser do tipoobj
porque estou escrevendo uma interface para uma mônada, então o Bind precisa vincular valores de tipos diferentes, dependendo da mônada que implementa a interface. Esta mônada específica é uma mônada de continuação, portanto, apenas deseja garantir que o parâmetro sejaSome(x)
e nãoNone
, depois passex
para descansar. (A razão pela qual preciso da interface é porque estou escrevendo um transformador de mônada e preciso de uma maneira de dizer que suas mônadas de parâmetro implementam bind e return.)
Atualizar Consegui contornar isso ao fazer o upcast do conteúdo da opção antes que ela se torne um parâmetro para essa função, mas ainda estou curioso para saber se posso testar o tipo ou converter um objeto (ou parâmetro genérico) em uma opção sem se preocupar com o tipo de opção que contém (assumindo, é claro, que o elenco é válido, ou seja, o objeto é realmente uma opção