यह एफ # भाषा में एक बुरा कोने-मामले की तरह लग रहा है, लेकिन मुझे यकीन है कि अगर यह एक द्वारा डिजाइन सीमा या संकलक में एक बग के रूप में उत्तीर्ण नहीं कर रहा हूँ। यदि यह डिज़ाइन सीमा से है, तो त्रुटि संदेश यह कहना चाहिए कि (क्योंकि वर्तमान में, यह अधिक समझ में नहीं आता है)।
वैसे भी, समस्या यह है कि एफ # कंपाइलर कोड उत्पन्न नहीं करता है जिसमें वास्तव में unit
आईएल में टाइप होता है। यह इसे void
(जब रिटर्न प्रकार के रूप में उपयोग किया जाता है) के साथ या खाली तर्क सूची (जब विधि या फ़ंक्शन तर्क के रूप में उपयोग किया जाता है) के साथ बदल देता है।
इसका मतलब है कि MyClass
प्रकार में, संकलक एक विधि है कि string
लेता है और void
रिटर्न के रूप में MyFun
सदस्य को संकलित करने का फैसला करता है (लेकिन आप एक सामान्य प्रकार तर्क के रूप में void
उपयोग नहीं कर सकते, तो यह सिर्फ काम नहीं करता है)। सिद्धांत रूप में, कंपाइलर इस मामले में वास्तविक unit
प्रकार का उपयोग कर सकता है (क्योंकि यह काम करने का एकमात्र तरीका है), लेकिन इससे शायद अन्य असंगतताएं कहीं और बन जाएंगी।
MyUnit
बनाने के साथ आपकी चाल समस्या है, मुझे लगता है कि समस्या को हल करने का एक बिल्कुल सही तरीका है। unit
(और जिस तरह से संकलित किया गया है) की कुछ सीमाओं से निपटने के लिए कार्यान्वयन के कुछ स्थानों (एसिंक्रोनस वर्कफ़्लो में) में कोर एफ # लाइब्रेरी MyUnit
जैसी कुछ भी उपयोग करती है।
स्रोत
2010-12-19 23:11:16
धन्यवाद टॉमस। मैंने इस मुद्दे को कहीं और नहीं देखा है (उदाहरण के लिए सामान्य कार्यों में;) –
@Stefan: यदि आप 'इकाई' प्रकार का तर्क (फ़ंक्शन या प्रकार के लिए) के रूप में उपयोग करते हैं तो यह आमतौर पर ठीक है। यह बग/सीमा शायद तभी दिखाई देती है जब अमूर्त सदस्यों को लागू किया जाता है (जो एफ # कंपाइलर के लिए थोड़ा मुश्किल क्षेत्र है, क्योंकि विरासत .NET में आश्चर्यजनक रूप से जटिल है) –
दिलचस्प बात यह है कि यह सी # में काम करेगी और मैं एफ # में कार्य का उपभोग कर सकता हूं। शायद एक बग के रूप में रिपोर्ट किया जाना चाहिए। –