所以我有一些具有难以记忆,冗长,笨拙的名字的COM类型,所以如果我可以避免它,我宁愿不必在从对象转换时输出它们。使用Seq.cast
,它会根据需要推断出所需的类型并进行投射。
以下是使用int的简化版本:
> let o = 1 :> obj;;
val o : obj = 1
> let inc x = x+1;;
val inc : int -> int
> inc o;;
inc o;;
----^
stdin(15,5): error FS0001: This expression was expected to have type
int
but here has type
obj
好的,有道理。所以我们投了它:
> inc (o :?> int);;
val it : int = 2
但是,如果我使用Seq.cast投射它,我不需要显式写入类型:
> inc ([o] |> Seq.cast |> Seq.head);;
val it : int = 2
是否有类似下面cast
的功能?
> inc (o |> cast);;
val it : int = 2
是否存在类型推断的F#cast
函数,如Seq.cast?
答案 0 :(得分:6)
您可以使用'unbox'和'box'运算符来利用类型推断
inc (unbox o)
答案 1 :(得分:4)
正如Leaf所提到的,box
和unbox
适用于obj
之间的转换。对于其他类型,您可以使用upcast
或静态强制转换运算符(:>
)进行向上转换,使用downcast
或动态强制转换(:?>
)运算符进行向下转换。可以使用通配符代替显式类型,例如:x :?> _
。