다음 질문을 보면서이 문제가 발생했습니다. F# Unit of Measure, Casting without losing the measure type 이 unbox 코드를 사용하려고하지 않고 있습니다. 질문에 대답하면서 행동.F # 'unbox float x'대 'unbox int x'이상한 컴파일 결과
이유는 무엇입니까 다음 코드 작업이는 System.InvalidCastException 산출하면서
let intToFloat (x:int<'u>) : float<'u> = unbox float x
intToFloat 1<second>
: '입력'86-6 @ float32ToFloat '형식의 개체를 캐스팅 할 수 없습니다를 Microsoft.FSharp.Core.FSharpFunc` 2 [System.Single, System.Double] '.?
let float32ToFloat (x:float32<'u>) : float<'u> = unbox float x
float32ToFloat 1.0f<second>
나는 코드가 예상대로 작동 (float x)
주위에 괄호를 넣어 경우, 그래서 그것을 어떤 식 평가/타입 추론 규칙 있어야합니다 가정합니다. 정확히 여기서 무슨 일이 일어나고 있고 두 번째 경우에 흉막 괄호가 필요한 이유는 무엇입니까?
Tomas의 답은 오류에 대해 설명 합니다만, 참고로 'unbox'가 최선의 방법은 아닙니다. 'LanguagePrimitives.FloatWithMeasure <'u>'을 사용해야하며, .NET 바이트 코드에서는 no-op로 변환됩니다. 반면에'unbox'는이 경우에는 필요없는 런타임 유형 검사를 추가합니다. – Tarmil
@ Tarmil, 나는 그것을 알고 있었다. 'FloatWithMeasure'가 더 나은 옵션이라는 것을 확인해 주셔서 고마워요. (링크 된 질문에 대한 저의 대답을보십시오). 거기에 추가/확인해 주시겠습니까? –
오, 내가 링크 된 질문에 귀하의 게시물을 보지 못했습니다. 그래서 우리는 꽤 똑같은 말을했습니다 :) – Tarmil