2011-11-08 6 views
8

एफ # इंटरएक्टिव में, कोड का निम्न भाग काम करता है:दशमलव रूपांतरण एफ # स्क्रिप्ट बनाम संकलित एफ #

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

हालांकि, एक संकलित एफ # कार्यक्रम में, एक त्रुटि संदेश प्रकट होता है:

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

वहाँ क्या हुआ? क्या ऐसा इसलिए है क्योंकि एफ # संस्करणों के बीच संदर्भों (संदर्भों के संस्करण) का अलग-अलग सेट उपयोग किया जाता है? या decimal के आंतरिक प्रतिनिधित्व संकलित और व्याख्या किए गए मोड में अलग हैं।

उत्तर

9

ऐसा इसलिए है क्योंकि आपका एफ # संकलित प्रोग्राम .NET Framework 2.0/F # 2.0 को लक्षित कर रहा है। एफ # इंटरैक्टिव .NET Framework 4.0/F # 4.0 का उपयोग कर रहा है।

2.0 फ्रेमवर्क FSharp.Core में BigInteger का उपयोग करता है। 4.0 फ्रेमवर्क System.Numerics.BigInteger का उपयोग करता है। FSharp.Core में दशमलव में रूपांतरण नहीं है।

अपनी परियोजना को .NET 4.0 को लक्षित करने के लिए बदलें और System.Numerics का संदर्भ जोड़ें और सबकुछ मेल खाना चाहिए।

+2

+1 तुम मुझे यह करने के लिए हराया। यदि कुछ अतिरिक्त विवरण उपयोगी थे, तो मैं अपना उत्तर वहां छोड़ दूंगा। –

2

आप सही हैं कि BigIntegerdecimal फ़ंक्शन का उपयोग करके परिवर्तित किया जा सकता है या नहीं, इसमें कुछ असंगतता है। ऐसा लगता है कि आप .NET के संस्करण पर निर्भर हैं जिसे आप संकलित कर रहे हैं। यदि आप विजुअल स्टूडियो 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. 

आप स्पष्ट रूप से mscorlib.dll और FSharp.Core.dll के संस्करण .NET 2.0 का हवाला लक्ष्य ढांचा बदल सकते हैं। फिर संकलक त्रुटि आप वर्णित रिपोर्ट:

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

एक ही परिणाम

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