2

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

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

2 回答 2

4

函数组合(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 -> objand unbox : obj -> 'T,因此函数在盒装(对象)和值类型(int)之间转换。您可以调用,因为 F#在调用函数时会unbox<int> 42自动插入转换 from intto 。obj

于 2011-08-05T16:19:20.723 回答
0

在相关的说明中:这种方法实际上非常有用。我用它来处理“对象表达式的类型等于初始类型”的行为。

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
于 2011-08-05T19:07:57.873 回答