F#unbox <int>返回obj </int>

时间:2011-08-05 16:17:01

标签: f# fsi

也许是一个愚蠢的问题,但是为什么unbox的返回值(在我的F#交互式会话中)被输入为obj而不是具体类型int?据我所知(尝试应用C#中的现有知识),如果它被输入为obj,那么它仍然是盒装的。示例如下:

> (unbox<int> >> box<int>) 42;;
val it : obj = 42
> 42;;
val it : int = 42

2 个答案:

答案 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 -> objunbox : 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