是否有类型推断的F#强制转换函数,如Seq.cast?

时间:2014-01-16 13:15:28

标签: casting f# type-inference

所以我有一些具有难以记忆,冗长,笨拙的名字的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?

2 个答案:

答案 0 :(得分:6)

您可以使用'unbox'和'box'运算符来利用类型推断

inc (unbox o)

答案 1 :(得分:4)

正如Leaf所提到的,boxunbox适用于obj之间的转换。对于其他类型,您可以使用upcast或静态强制转换运算符(:>)进行向上转换,使用downcast或动态强制转换(:?>)运算符进行向下转换。可以使用通配符代替显式类型,例如:x :?> _