मेरा प्रश्न कुछ हद तक इस से संबंधित है - Functions with generic parameter types - लेकिन मैं काफी कुछ नहीं कर सकता कि मैं क्या चाहता हूं।एफ #: ओवरलोडिंग फ़ंक्शन
मैं एक परिभाषित करना चाहते हैं विभिन्न सी # वर्गों पर वंशज 'तो जैसे' वंश के लिए कॉल रैप करने के लिए कार्य करते हैं ':
जाने वंश का नाम (xDocument: XDocument) = xDocument.Descendants नाम
सन्तान जाने नाम (xElement: XElement) = xElement.Descendants नाम
यह दृष्टिकोण काम नहीं करता है क्योंकि हमारे पास 'वंश' की डुप्लिकेट परिभाषा है।
मैंने सोचा कि यह इनलाइन समारोह का उपयोग करें और स्थिर निम्नलिखित विधि को परिभाषित करने के मापदंडों को हल करने के बजाय यह करने के लिए संभव हो जाएगा:
let inline descendants name (xml : ^x when ^x : (member Descendants : XName -> seq<XElement>)) =
xml.Descendants name
लेकिन मैं जब ऐसा करने की कोशिश कर रहा है इस त्रुटि हो रही है :
इस कार्यक्रम बिंदु से पहले जानकारी के आधार पर अनिश्चित प्रकार की वस्तु पर लुकअप। ऑब्जेक्ट के प्रकार को बाधित करने के लिए इस प्रोग्राम बिंदु से पहले एक प्रकार की एनोटेशन की आवश्यकता हो सकती है। यह लुकअप को हल करने की अनुमति दे सकता है।
क्या कोई तरीका है कि मैं वह दूसरा कार्य लिख सकता हूं जो मैं चाहता हूं?
आह मुझे एहसास नहीं हुआ कि ओवरलोडिंग केवल सदस्यों के लिए ही काम करती है, जाहिर है कि अन्य पोस्ट को पर्याप्त रूप से पर्याप्त नहीं पढ़ा! यह भी नहीं उठाया कि वे दोनों एक्सकॉन्टेनर से विरासत में हैं, इसलिए धन्यवाद, यह एक बेहतर समाधान है –
मैंने सामान्य अधिभार वास्तव में कोशिश की और संकलक कहता है कि दो सदस्यों को 'descendants' कहा जाता है, उसी तर्क के साथ –
कुछ पहले संस्करण, एफ # कंपाइलर की आवश्यकता है '[<ओवरलोड आईडी ("कुछ नाम")>]' ओवरलोडिंग के दौरान इस्तेमाल किया जाना चाहिए, लेकिन मुझे यकीन नहीं है कि यह किस संस्करण में हटा दिया गया था ... मैंने अभी एफ # आरसी में सरल उदाहरण की कोशिश की है (दो विधियां , दो तर्कों के साथ दोनों) और यह ठीक काम किया ('अधिभार आईडी के बिना)। –