2016-11-28 8 views
10

से एफ # में प्रयोग किया जाता निर्दिष्ट विधि को जन्म देती है समर्थित नहीं है अपवाद मैं का उपयोग करता है एफ # में यह सामान्य कार्य हो सी #:ऑपरेटर (- -)() ऑपरेटर सी #

Unhandled Exception: System.NotSupportedException: Specified method is not supported. at ProjA.MainClass.Main (System.String[] args) [0x00000] in <4f209fa43741462db3b8f73ac83c35a2>:0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NotSupportedException: Specified method is not supported. at ProjA.MainClass.Main (System.String[] args) [0x00000] in <4f209fa43741462db3b8f73ac83c35a2>:0

:

int a = sub<int, int, int>(4, 1);

यह एक त्रुटि को जन्म देती है

कृपया ध्यान दें कि यह (+) ऑपरेटर के लिए या इनलाइन कीवर्ड के बिना ठीक काम करता है।

1) क्या मैं कुछ गलत कर रहा हूं या यह एक बग है?

2) क्या इस मुद्दे को दूर करने का कोई तरीका है (लेकिन मुझे इस फ़ंक्शन को सामान्य बनाने के लिए इनलाइन कीवर्ड की आवश्यकता है)?

3) क्या आपने सी # से f # फ़ंक्शन को कॉल करते समय कुछ ऐसा अनुभव किया है, आपने इसे कैसे हल किया?

मै मैकोज सिएरा पर मोनो 4.8 का उपयोग कर रहा हूं।

+0

@EJoshuaS कंपाइलर स्वयं तीन पैरामीटर लागू करता है, जो अंतिम प्रकार के रिटर्न प्रकार के लिए होता है। तर्क टाइप करें संकलक द्वारा स्वचालित रूप से अनुमानित नहीं किया जा सकता है। जैसा कि मैंने उल्लेख किया है, अजीब चीज यह है कि जब मैं (-) से (+) बदलता हूं तो सब कुछ अपवाद के बिना ठीक काम करता है। – mateuszlewko

+0

हां, कृपया मेरी पिछली टिप्पणी को अनदेखा करें, मैंने देखा कि एक बार मैंने इसे स्वयं करने की कोशिश की। मैं उस तरह के व्यवहार से थोड़ा आश्चर्यचकित हूं (मैंने अपनी मशीन पर एक ही चीज़ देखी है)। स्पष्ट रूप से "इनलाइन" कीवर्ड [थोड़ा अजीब हो सकता है] (http://stackoverflow.com/questions/4413324/how-does-f-inline-work) जब C# से F # पर कॉल किया जाता है - वास्तव में, जब मैं हटा देता हूं इनलाइन फ़ंक्शन यह सही ढंग से व्यवहार करता है - लेकिन मैं थोड़ा परेशान हूं कि यह "+" के लिए क्यों काम करेगा लेकिन नहीं - "। मैं वास्तव में वास्तव में एक स्पष्टीकरण देखना चाहता हूं कि यह क्यों है अगर कोई जानता है। – EJoshuaS

+1

मुझे आश्चर्य होगा कि यह भी काम करता है - मुझे संदेह है कि यदि आप + का उपयोग करते हैं तो शायद आप किसी और चीज की परिभाषा को छाया दे रहे हैं। इनलाइन के लिए, एफ # कंपाइलर वास्तव में कोई फ़ंक्शन नहीं बनाता है, यह केवल कुछ मेटाडेटा बनाता है जो इसका उपयोग कर सकते हैं।तथ्य यह है कि सी # कंपाइलर इसे देखता है इस प्रकार आश्चर्यजनक है –

उत्तर

7

सामान्य रूप से, inline के रूप में घोषित फ़ंक्शंस अन्य भाषाओं से उपयोग योग्य नहीं होंगे (या F # से समान नहीं होंगे)। उन्हें कॉल साइट पर एफ # कंपाइलर की सुविधा के रूप में प्रतिस्थापित किया गया है, जो सी # और अन्य सीएलआर भाषाओं द्वारा समर्थित नहीं है। यह इन अन्य भाषाओं में एफ # का एक महत्वपूर्ण लाभ है।

हालांकि, कुछ अपवाद हैं। एफ # इनलाइन फ़ंक्शंस लिखना संभव है जो रनटाइम प्रकार के आधार पर प्रेषण निष्पादित करते हैं, जो तब सी # और अन्य भाषाओं से उपयोग योग्य है। आम तौर पर, इन्हें एक ही आईएल नहीं मिलेगा जब सी # से उपयोग किया जाता है क्योंकि वे कुछ प्रकार के लिए एफ # से करते हैं (आदिम प्रकारों के लिए विशिष्ट हैंडलर को संभाला नहीं जाएगा)। यही कारण है कि (+) काम करता है - आप this in the code for the operator देख सकते हैं, जहां (+)AdditionDynamic<(^T),(^U),(^V)> x y पर कॉल करता है। ध्यान दें कि (-)is missing the runtime dispatched version, और स्पष्ट रूप से [<NoDynamicInvocation>] के रूप में चिह्नित किया गया है, यही कारण है कि यह C# से काम करने में विफल रहता है।

यह प्रभावी रूप से सी # में समान सीमा है जिसके कारण लोगों ने IArithmetic (* इंटरनेट आर्काइव का उपयोग करके कनेक्ट में छिपा हुआ है) से कई वर्षों तक अनुरोध करने का कारण बना दिया है। एफ # statically resolved type parameters के माध्यम से इसके आसपास काम करता है, लेकिन यह सुविधा F # के लिए विशिष्ट है, और सी # और अन्य भाषाओं से काम नहीं करेगा। एफ # के माध्यम से फ़ंक्शन को लपेटना इसे सी # में सक्षम नहीं करता है।

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