十进制转换F#脚本与编译F#

时间:2011-11-08 01:51:23

标签: f# decimal type-conversion

在F#Interactive中,以下代码可以运行:

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

但是,在编译的F#程序中,会出现错误消息:

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

那里发生了什么?是因为F#版本之间使用了不同的引用集(和引用版本)吗?或者decimal的内部表示在编译和解释模式中是不同的。

3 个答案:

答案 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.dllFSharp.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