F#装箱(box)与拆箱(unbox)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// int装箱 此时o的类型是 obj
let o = box 1
// 常规的拆箱方法是
let a = unbox<int> o
let b : int = unbox o
let c = o :?> int

// 如果把元组装箱呢?
let o = box (1, "a")
// FSI显示数据类型是 int * string
// 以下三种方法都通过了
let a = unbox<int string *> o
let b : (int * string) = unbox o
let c = o :?> int * string

// 接下来把一个表装箱
let o = box [1; 2; 3]
// 用unbox拆箱表是可行的
let a = unbox<int list> o
let b : (int list) = unbox o
// 但是下面这句却不行
let c = o :?> (int list)

// 感谢code17的指正
// 由于多余的括号 误把list当成了int的参数了
// 正确写法是:
let c = o :?> int list

// 同理 array与option的拆箱方法:
(box [|"a"; "b"|] :?> string array)
(box (Some(1)) :?> int option)

之前以为这些集合类型是不能动态拆箱的, 还由此得出了错误结论, 再次感谢code17的及时指正.