2010-12-19 13 views
16

के कारण कोई भी जानता है कि यह संकलन करने में विफल क्यों होता है?एफ # इंटरफ़ेस विरासत विफलता इकाई

type MyInterface<'input, 'output> = 
    abstract member MyFun: 'input -> 'output 

type MyClass() = 
    interface MyInterface<string, unit> with 
     member this.MyFun(input: string) =() 
    //fails with error FS0017: The member 'MyFun : string -> unit' does not have the correct type to override the corresponding abstract method. 
type MyUnit = MyUnit 
type MyClass2() = 
    //success 
    interface MyInterface<string, MyUnit> with 
     member this.MyFun(input: string) = MyUnit 

उत्तर

15

यह एफ # भाषा में एक बुरा कोने-मामले की तरह लग रहा है, लेकिन मुझे यकीन है कि अगर यह एक द्वारा डिजाइन सीमा या संकलक में एक बग के रूप में उत्तीर्ण नहीं कर रहा हूँ। यदि यह डिज़ाइन सीमा से है, तो त्रुटि संदेश यह कहना चाहिए कि (क्योंकि वर्तमान में, यह अधिक समझ में नहीं आता है)।

वैसे भी, समस्या यह है कि एफ # कंपाइलर कोड उत्पन्न नहीं करता है जिसमें वास्तव में unit आईएल में टाइप होता है। यह इसे void (जब रिटर्न प्रकार के रूप में उपयोग किया जाता है) के साथ या खाली तर्क सूची (जब विधि या फ़ंक्शन तर्क के रूप में उपयोग किया जाता है) के साथ बदल देता है।

इसका मतलब है कि MyClass प्रकार में, संकलक एक विधि है कि string लेता है और void रिटर्न के रूप में MyFun सदस्य को संकलित करने का फैसला करता है (लेकिन आप एक सामान्य प्रकार तर्क के रूप में void उपयोग नहीं कर सकते, तो यह सिर्फ काम नहीं करता है)। सिद्धांत रूप में, कंपाइलर इस मामले में वास्तविक unit प्रकार का उपयोग कर सकता है (क्योंकि यह काम करने का एकमात्र तरीका है), लेकिन इससे शायद अन्य असंगतताएं कहीं और बन जाएंगी।

MyUnit बनाने के साथ आपकी चाल समस्या है, मुझे लगता है कि समस्या को हल करने का एक बिल्कुल सही तरीका है। unit (और जिस तरह से संकलित किया गया है) की कुछ सीमाओं से निपटने के लिए कार्यान्वयन के कुछ स्थानों (एसिंक्रोनस वर्कफ़्लो में) में कोर एफ # लाइब्रेरी MyUnit जैसी कुछ भी उपयोग करती है।

+0

धन्यवाद टॉमस। मैंने इस मुद्दे को कहीं और नहीं देखा है (उदाहरण के लिए सामान्य कार्यों में;) –

+0

@Stefan: यदि आप 'इकाई' प्रकार का तर्क (फ़ंक्शन या प्रकार के लिए) के रूप में उपयोग करते हैं तो यह आमतौर पर ठीक है। यह बग/सीमा शायद तभी दिखाई देती है जब अमूर्त सदस्यों को लागू किया जाता है (जो एफ # कंपाइलर के लिए थोड़ा मुश्किल क्षेत्र है, क्योंकि विरासत .NET में आश्चर्यजनक रूप से जटिल है) –

+1

दिलचस्प बात यह है कि यह सी # में काम करेगी और मैं एफ # में कार्य का उपभोग कर सकता हूं। शायद एक बग के रूप में रिपोर्ट किया जाना चाहिए। –

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