也许是一个愚蠢的问题,但是为什么unbox
(在我的 F# Interactive 会话中)出现的返回值被键入为obj
而不是具体类型int
?据我所知(尝试应用 C# 中的现有知识),如果它是这样输入的,obj
那么它仍然是装箱的。示例如下:
> (unbox<int> >> box<int>) 42;;
val it : obj = 42
> 42;;
val it : int = 42
函数组合(f >> g) v
意味着g (f (v))
,因此您实际上是在最后调用(并且不需要box<int>
调用 to ):unbox<int>
> box<int> (unbox<int> 42);;
val it : obj = 42
> box<int> 42;;
val it : obj = 42
类型是box : 'T -> obj
and unbox : obj -> 'T
,因此函数在盒装(对象)和值类型(int)之间转换。您可以调用,因为 F#在调用函数时会unbox<int> 42
自动插入转换 from int
to 。obj
在相关的说明中:这种方法实际上非常有用。我用它来处理“对象表达式的类型等于初始类型”的行为。
let coerce value = (box >> unbox) value
type A = interface end
type B = interface end
let x =
{ new A
interface B }
let test (b:B) = printf "%A" b
test x //doesn't compile: x is type A (but still knows how to relax)
test (coerce x) //works just fine