也许是一个愚蠢的问题,但为什么unbox
的返回值出现(在我的f#交互式会话中)被键入为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>
(对unbox<int>
的调用是不必要的):
> box<int> (unbox<int> 42);;
val it : obj = 42
> box<int> 42;;
val it : obj = 42
类型为box : 'T -> obj
和unbox : obj -> 'T
,因此函数在盒装(对象)和值类型(int)之间进行转换。您可以调用unbox<int> 42
,因为f#在调用函数时自动插入从int
到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