在F#Interactive中,以下代码可以运行:
> printfn "%A" (decimal 1I)
1M
但是,在编译的F#程序中,会出现错误消息:
The type 'Numerics.BigInteger' does not support a conversion to the type 'decimal'
那里发生了什么?是因为F#版本之间使用了不同的引用集(和引用版本)吗?或者decimal
的内部表示在编译和解释模式中是不同的。
答案 0 :(得分:9)
这可能是因为您的F#编译程序的目标是.NET Framework 2.0 / F#2.0。 F#interactive使用的是.NET Framework 4.0 / F#4.0。
2.0 Framework使用FSharp.Core中的BigInteger
。 4.0 Framework使用System.Numerics.BigInteger
。 FSharp.Core没有转换为十进制。
将项目更改为目标.NET 4.0并添加对System.Numerics的引用,所有内容都应该匹配。
答案 1 :(得分:2)
您是否可以使用BigInteger
函数转换decimal
是否存在不一致。它似乎取决于您正在编译的.NET版本。如果您使用的是Visual Studio 2010中的F#编译器(或F#interactive),则默认目标是.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.
您可以通过显式引用.NET 2.0版本的mscorlib.dll
和FSharp.Core.dll
来更改目标框架。然后编译器报告您描述的错误:
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进行编译。
答案 2 :(得分: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