2011-11-08 4 views
8

컴파일 대, 다음 코드 조각이 작동합니다진수 변환 F # 스크립트 F # 대화에서 F 번호

> printfn "%A" (decimal 1I) 
1M 

을하지만, 컴파일 된 F # 프로그램에 오류 메시지가 나타납니다

The type 'Numerics.BigInteger' does not support a conversion to the type 'decimal' 

거기서 무슨 일이 일어 났어? 다른 참조 집합 (및 참조 버전)이 F # 버전간에 사용 되었기 때문입니까? 또는 decimal의 내부 표현은 컴파일 된 모드와 해석 된 모드에서 서로 다릅니다.

답변

9

F # 컴파일 된 프로그램이 .NET Framework 2.0/F # 2.0을 대상으로하기 때문에 가능합니다. F # 대화 형은 .NET Framework 4.0/F # 4.0을 사용합니다.

2.0 프레임 워크는 FSharp.Core에 BigInteger을 사용합니다. 4.0 프레임 워크는 System.Numerics.BigInteger을 사용합니다. FSharp.Core는 십진수로 변환되지 않습니다.

프로젝트를 .NET 4.0 대상으로 변경하고 System.Numerics에 대한 참조를 추가하면 모든 것이 일치해야합니다.

+2

+1 당신은 나를 이겼다. 추가 정보 중 일부가 유용 할 경우를 대비하여 대답을 남겨 둘 것입니다. –

2

decimal 기능을 사용하여 BigInteger을 변환 할 수 있는지 여부에 약간의 불일치가 있다는 것이 맞습니다. 그것은 당신이 컴파일하는 .NET의 버전에 의존하는 것 같다. Visual Studio 2010에서 F # 컴파일러 (또는 F # 대화식)를 사용하는 경우 기본 대상은 .NET 4.0입니다. 그 대상의 경우, 컴파일은 잘 작동 :

C:\Temp>"C:\Program Files (x86)\Microsoft F#\v4.0\Fsc.exe" test.fs 
Microsoft (R) F# 3.0 Compiler build 2.0.0.0 
Copyright (c) Microsoft Corporation. All Rights Reserved. 

당신은 명시 적으로 mscorlib.dllFSharp.Core.dll의 버전 .NET 2.0을 참조하여 대상 프레임 워크를 변경할 수 있습니다. 그리고 컴파일러는 당신이 설명한 오류 보고서 :

C:\Temp>"C:\Program Files (x86)\Microsoft F#\v4.0\Fsc.exe" test.fs --noframework 
    -r:C:\Program Files (x86)\FSharp-2.0.0.0\bin\FSharp.Core.dll 
    -r:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll 
Microsoft (R) F# 3.0 Compiler build 2.0.0.0 
Copyright (c) Microsoft Corporation. All Rights Reserved. 

test.fs(1,23): error FS0001: The type 'System.Numerics.BigInteger' does not support 
    a conversion to the type 'decimal' 

프로젝트를 컴파일 할 때 오류가 발생하는 경우, 다음 프로젝트는 아마도 .NET 2.0 컴파일하도록 구성되어 있습니다.

0

같은 결과는

Microsoft(R) F# 2.0 Interactive ビルド 4.0.40219.1 
Copyright (c) Microsoft Corporation. All Rights Reserved. 
> printfn "%A" (decimal 1I);; 
1M 
val it : unit =() 

>fsc test.fs 
Microsoft(R) F# 2.0 Compiler ビルド 4.0.40219.1 
Copyright (c) Microsoft Corporation. All Rights Reserved. 

>test 
1M