Десятичное преобразование F # Script против скомпилированного F # - PullRequest
8 голосов
/ 08 ноября 2011

В F # Interactive работает следующий фрагмент кода:

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

Однако в скомпилированной F # -программе появляется сообщение об ошибке:

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

Что там произошло? Это потому, что разные версии ссылок (и версий ссылок) используются между версиями F #? или внутренние представления decimal различны в скомпилированном и интерпретированном режимах.

Ответы [ 3 ]

9 голосов
/ 08 ноября 2011

Вероятно, это связано с тем, что ваша скомпилированная программа F # ориентирована на .NET Framework 2.0 / F # 2.0. Интерактивный F # использует .NET Framework 4.0 / F # 4.0.

2.0 Framework использует BigInteger в FSharp.Core. 4.0 Framework использует System.Numerics.BigInteger. FSharp.Core one не имеет преобразования в десятичное число.

Измените ваш проект на целевой .NET 4.0 и добавьте ссылку на System.Numerics, и все должно совпадать.

2 голосов
/ 08 ноября 2011

Вы правы, что существует некоторая несогласованность в том, можно ли преобразовать BigInteger с помощью функции decimal или нет. Кажется, это зависит от версии .NET, для которой вы компилируете. Если вы используете компилятор F # (или интерактивный F #) из Visual Studio 2010, тогда целью по умолчанию является .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.

0 голосов
/ 08 ноября 2011

Тот же результат

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
...