2010-07-09 19 views
12

क्या कोई बता सकता है कि नीचे दूसरा उदाहरण संकलित क्यों नहीं होगा?क्यों 'कोड पर्याप्त सामान्य नहीं है'?

'टेस्ट 2' देता है "त्रुटि FS0670: इस कोड को पर्याप्त रूप से सामान्य नहीं है प्रकार चर^एक है क्योंकि यह अपने दायरे से बच जाएगा सामान्यीकृत नहीं जा सका।।"। मैं इस त्रुटि संदेश को समझने में असफल रहा।

// Test 1 
type test1<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> a.ToString() 

// Test 2 
type test2<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> string a 

// Test 3 
type test3<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> string (a :> obj) 

उत्तर

5

यहाँ एक और रेप्रो है:

let inline f< ^T>(x:^T) = box x 

type test4<'a> = | A of 'a 
    with 
    member t.M() = 
     match t with 
     | A a -> f a 

string एक इनलाइन समारोह स्थिर प्रकार की कमी का उपयोग करता है, और इस तरह के कार्यों के लिए त्रुटि निदान कभी कभी गरीब हैं। मैं वास्तव में नैदानिक ​​संदेश ही समझ में नहीं आता है, लेकिन बिंदु, कॉल स्थल पर, हम सामान्य प्रकार 'a, जिसका अर्थ है कि हम में string (या f करने के लिए कॉल का सही संस्करण अनुरूप नहीं कर सकते हैं पता नहीं है है मेरा repro)। उदाहरण में इस मामले में जहां आप Upcast obj करने के लिए, हम जानते हैं कि हम string की obj संस्करण इनलाइन करना चाहते हैं, तो यह है कि ठीक है।

0

मैं कल्पना क्योंकि तार का (obj -> स्ट्रिंग) एक हस्ताक्षर है यह तो अपने आप ही स्ट्रिंग का उपयोग प्रकार obj के होने के लिए एक मजबूर कर रहा है। (एफ # अंतर्निहित डाले क्या करता है नहीं।)

+1

'स्ट्रिंग' [ '' वास्तव में टी है -> स्ट्रिंग'] (http://msdn.microsoft.com/en-gb/library/ee340491.aspx), इसलिए इस सिद्धांत में काम करना चाहिए। हालांकि त्रुटि के लिए मेरे पास बेहतर स्पष्टीकरण नहीं है। –

+0

ओह हाँ, मैं बस स्ट्रिंग फंस गया ;; प्रकार प्राप्त करने के लिए एफ # इंटरैक्टिव में। संभवतः वास्तव में स्ट्रिंग का उपयोग करके संकलन को इनपुट पर एक प्रकार को मजबूर करने के लिए मजबूर कर रहा है, और यह सबसे कम आम denominator के रूप में obj चुन रहा है? – Massif

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