2013-11-28 7 views
10

टी एल; डॉ: एफ # संकलक int operator के रूप में इस संदर्भ में int व्याख्या determined by Eugene Fotin और expanded upon by Gene Belitski के रूप में। सबसे अच्छा कामकाज System.Int32.MaxValue या नीचे वर्णित एक अद्वितीय प्रकार उपनाम का उपयोग करना है।एफ # int.MaxValue "मान्य निरंतर अभिव्यक्ति नहीं है," लेकिन System.Int32.MaxValue है?


निम्नलिखित रिकॉर्ड प्रकार पर विचार करें:

type User = { 
    Username : string 
} 

मैं Username कम से कम तीन अक्षर लंबा होना चाहते हैं, तो मैं StringLength विशेषता का उपयोग। कोई अधिकतम लंबाई है, इसलिए मैं यह int.MaxValue करने के लिए सेट: अगर मैं System.Int32 बजाय का उपयोग

This is not a valid constant expression or custom attribute value.

सब कुछ विलक्षण है:

type User = { 
    [<StringLength(int.MaxValue, MinimumLength=3)>] 
    Username : string 
} 

यह मैं निम्नलिखित त्रुटि देता है

type User = { 
    [<StringLength(System.Int32.MaxValue, MinimumLength=3)>] 
    Username : string 
} 

यह भी संकलित करता है अगर मैं int:

type User = { 
    [<StringLength(num.MaxValue, MinimumLength=3)>] 
    Username : string 
} 
and num = int 

या पूरी तरह से प्रकार अर्हता:

type User = { 
    [<StringLength(Microsoft.FSharp.Core.int.MaxValue, MinimumLength=3)>] 
    Username : string 
} 

मैं एफ # स्रोत और int is defined exactly as you would expect में जाँच:

type int32 = System.Int32 
// Then, a few lines later… 
type int = int32 

क्या हो रहा है? मैंने माना कि एफ # आदिम प्रकार अन्य संदर्भों के साथ अन्य संदर्भों के साथ अंतर-परिवर्तनीय थे, लेकिन ऐसा लगता है कि मेरे मानसिक मॉडल से कुछ गुम है।

उत्तर

11

कैसे एफ # प्रकार निष्कर्ष अलग वाक्यात्मक संस्थाओं संयोग से एक ही नाम है, जो int के मामले में से कोई भी हो सकता है होने के साथ विभिन्न संदर्भों में काम करता है यही कारण है कि: पूरा नाम की

  • समारोह int:'T->intMicrosoft.FSharp.Core.Operators.int
  • type int = int32 की पूरा नाम Microsoft.FSharp.Core.int
  • type int<'Measure> = int पूरा नाम की Microsoft.FSharp.Core.int<_>

एक तरीका यह कामकाज डेमो के लिए इस परिदृश्य पर होगा: अगर हम सिर्फ FSI में

int;; 

दर्ज हम जैसे

val it : (int -> int) = <fun:[email protected]> 
दूसरे शब्दों में

कुछ मिल जाएगा, यह एक समारोह है कि नहीं कर सकते MaxValue संपत्ति के साथ जुड़े है

> int.MaxValue;; 

int.MaxValue;; 
----^^^^^^^^ 

... error FS0039: The field, constructor or member 'MaxValue' is not defined 

ही, int32 पर लागू होगा जो, जब अभिव्यक्ति के संदर्भ में उपयोग किया जा रहा है तो एफएसआई द्वारा हस्ताक्षर (int -> int32) के साथ एक और समारोह के रूप में अनुमानित है।

अब जब यह इस संदर्भ int में

type num = int 

की बात आती है System.Int32 के लिए एक प्रकार का नाम संक्षिप्त नाम है, इसलिए num एक प्रकार संक्षिप्त नाम के रूप में अच्छी तरह से है, लेकिन अब अस्पष्टता जगह नहीं है नाम मान लिया जाता है, इसलिए जब आप Microsoft.FSharp.Core.int का उपयोग आप स्पष्ट रूप से प्रकार इकाई का संदर्भ num.MaxValue वास्तव में मान लिया जाता है कि हम क्या यह होने की उम्मीद, FSI में दे रही है

> num.MaxValue;; 
val it : int = 2147483647 

अंत में, कोई है अस्पष्टता के लिए जगह, तो यह उम्मीद के रूप में काम करता है।

विशेषता पैरामीटर के साथ अपने उपयोग मामले पर वापस - इस संदर्भ में int को तर्क मान देने के लिए अभिव्यक्ति के हिस्से के रूप में प्रकार अनुमान के रूप में माना जाता है, यानी कार्य के रूप में, जब तक कि आप स्पष्ट रूप से या परोक्ष रूप से एक और व्याख्या निर्धारित नहीं करते।

5

संकलक एक रूपांतरण समारोह int के रूप में एक विशेषता के पैरामीटर में int इलाज की तरह लग रहा।

+0

आप सही हैं, यही चल रहा है। मुझे आश्चर्य है कि ऐसा क्यों है? एफ # व्याकरण में कुछ, मुझे लगता है? –

संबंधित मुद्दे