2011-11-08 21 views
8

In F # Interactive, il seguente pezzo di codice funziona:decimale di conversione F # Script vs. Compilato F #

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

Tuttavia, in un programma # F compilato, viene visualizzato un messaggio di errore:

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

Cosa è successo la? È perché le diverse serie di riferimenti (e versioni di riferimenti) sono utilizzate tra le versioni di F #? oppure le rappresentazioni interne di decimal sono diverse tra le modalità compilate e interpretate.

risposta

9

Ciò è probabile perché il programma F # compilato è destinato a .NET Framework 2.0/F # 2.0. L'interfaccia interattiva F sta usando .NET Framework 4.0/F # 4.0.

Il Framework 2.0 utilizza il BigInteger in FSharp.Core. 4.0 Framework utilizza System.Numerics.BigInteger. Il file FSharp.Core non ha la conversione in decimale.

Cambia il progetto di destinazione .NET 4.0 e aggiungere un riferimento a System.Numerics e tutto dovrebbe abbinare.

+2

+1 Mi ha battuto ad esso. Lascerò la mia risposta lì, nel caso in cui alcuni dei dettagli aggiuntivi fossero utili. –

2

Hai ragione che c'è qualche incongruenza nel fatto che BigInteger possa essere convertito usando la funzione decimal oppure no. Sembra dipendere dalla versione di .NET che stai compilando. Se stai utilizzando il compilatore F # (o F # interattivo) da Visual Studio 2010, la destinazione predefinita è .NET 4.0. Per tale obiettivo, la compilazione funziona bene:

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. 

È possibile modificare il framework di destinazione facendo riferimento esplicitamente NET 2.0 versione di mscorlib.dll e FSharp.Core.dll. Poi il compilatore segnala l'errore che hai descritto:

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' 

Se stai ricevendo l'errore quando si compila il progetto, allora il progetto è probabilmente configurato per compilare for .NET 2.0.

0

Stesso risultato

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 
Problemi correlati