Это возникло, когда я рассмотрел следующий вопрос: F # Единица измерения, приведение без потери типа меры Обратите внимание, что я не пытаюсь использовать этот код распаковки, я только что обнаружил странное поведение, отвечая на вопрос.
Почему работает следующий код
let intToFloat (x:int<'u>) : float<'u> = unbox float x
intToFloat 1<second>
при этом возникает System.InvalidCastException: невозможно преобразовать объект типа 'float32ToFloat @ 86-6' в тип 'Microsoft.FSharp.Core.FSharpFunc`2 [System.Single, System.Double]'. em >?
let float32ToFloat (x:float32<'u>) : float<'u> = unbox float x
float32ToFloat 1.0f<second>
Если я заключу скобки вокруг (float x)
, код будет работать, как ожидалось, поэтому я предполагаю, что это должно быть какое-то правило оценки выражения / вывода типа. Что именно здесь происходит и зачем нужны скобки во втором случае?
unbox
- не лучший способ сделать это. Вы должны использоватьLanguagePrimitives.FloatWithMeasure<'u>
, что в байт-коде .NET означает отсутствие операции, тогда какunbox
добавляет некоторую проверку типа во время выполнения, которая в данном случае не требуется. - person Tarmil   schedule 15.02.2014FloatWithMeasure
- лучший вариант (см. Мой ответ на связанный вопрос). Не могли бы вы добавить / подтвердить это и там? - person Johannes Rudolph   schedule 15.02.2014