F # unbox <int>возвращает объект - PullRequest
       17

F # unbox <int>возвращает объект

2 голосов
/ 05 августа 2011

Возможно, глупый вопрос, но почему возвращаемое значение из unbox появляется (в моем интерактивном сеансе F #), чтобы быть напечатанным как obj вместо конкретного типа int? Насколько я могу понять (пытаясь применить существующие знания из C #), если он напечатан как obj, то он все еще в штучной упаковке. Пример следует:

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

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Композиция функций (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 при вызове функции.

0 голосов
/ 05 августа 2011

На заметку: такой метод на самом деле весьма полезен.Я использую его для работы с "тип выражения объекта равен начальному типу" поведения.

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
...