也许是一个愚蠢的问题,但是为什么unbox
的返回值(在我的F#交互式会话中)被输入为obj
而不是具体类型int
?据我所知(尝试应用C#中的现有知识),如果它被输入为obj
,那么它仍然是盒装的。示例如下:
> (unbox<int> >> box<int>) 42;;
val it : obj = 42
> 42;;
val it : int = 42
答案 0 :(得分:4)
功能组合(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
。
答案 1 :(得分:0)
相关说明:这种方法实际上非常有用。我用它来处理"the type of an object expression is equal to the initial type"行为。
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