Может кто-нибудь объяснить следующее, это кажется немного противоречивым.
Эта строка кода недействительна:
let l = [("Hi", 1); ("Ho", "One")]
Потому что кортежи разные, string*int vs string*string OK.
Эта строка кода также недействительна:
let (m: (string*obj) list) = [("Hi", 1); ("Ho", "One")]
Я прямо говорю ему, что это список кортежей string*obj, но он не приводит автоматически 1 и «One» к obj. Хорошо и с этим.
Эта строка кода действительна:
let (n: (string*obj) list) = [("Hi", unbox(1)); ("Ho", unbox("One"))]
В этом случае я явно распаковываю 1 и «Один», и это работает.
Вот где я думаю, что вещи становятся немного непоследовательными. Возьмите следующее:
type thing =
{
name: string
value: obj
}
let (p: thing list) = [{name="Hi"; value=1}; {name="Ho"; value="One"}]
Этот код действителен. Значения 1 и «Один» присваиваются «значению», которое является объектом.
Почему мне не нужно распаковывать член типа, а нужно распаковывать элемент в кортеже?
box
. Никогда не вводитеunbox/:?>
— это небезопасно. Обратите внимание, что ваш пример действительно читается как("Hi", unbox (box 1))
так же, как("Hi", box 1)
. - person t0yv0   schedule 31.10.2013