2011-11-08 38 views
8

Trong F # Interactive, đoạn mã sau đây hoạt động:Decimal chuyển đổi F # Script vs Biên soạn F #

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

Tuy nhiên, trong một F # chương trình biên soạn, một thông báo lỗi xuất hiện:

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

Điều gì đã xảy ra ở đó? Có phải vì tập hợp các tham chiếu khác nhau (và các phiên bản tham chiếu) được sử dụng giữa các phiên bản F # không? hoặc các biểu diễn nội bộ của decimal khác nhau giữa các chế độ được biên dịch và diễn giải.

Trả lời

9

Điều này có thể do chương trình biên dịch F # của bạn đang nhắm mục tiêu .NET Framework 2.0/F # 2.0. Tương tác F # đang sử dụng .NET Framework 4.0/F # 4.0.

Khung 2.0 sử dụng BigInteger trong FSharp.Core. Khung 4.0 sử dụng System.Numerics.BigInteger. Các FSharp.Core một không có chuyển đổi sang thập phân.

Thay đổi dự án của bạn để nhắm mục tiêu .NET 4.0 và thêm tham chiếu vào System.Numerics và mọi thứ sẽ khớp.

+2

+1 Bạn đánh bại tôi vào nó. Tôi sẽ để lại câu trả lời của tôi ở đó, trong trường hợp một số chi tiết bổ sung hữu ích. –

2

Bạn nói đúng là có một số mâu thuẫn trong đó có thể chuyển đổi BigInteger bằng chức năng decimal hay không. Dường như nó phụ thuộc vào phiên bản .NET mà bạn đang biên dịch. Nếu bạn đang sử dụng trình biên dịch F # (hoặc tương tác F #) từ Visual Studio 2010, thì mục tiêu mặc định là .NET 4.0. Đối với mục tiêu đó, biên soạn hoạt động tốt:

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. 

Bạn có thể thay đổi khuôn khổ mục tiêu bằng cách tham khảo một cách rõ ràng .NET 2.0 phiên bản của mscorlib.dllFSharp.Core.dll. Sau đó trình biên dịch báo cáo lỗi bạn mô tả:

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' 

Nếu bạn gặp lỗi khi biên dịch dự án, khi đó dự án của bạn có thể được cấu hình để biên dịch .NET 2.0.

0

Cùng một kết quả

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