में टाइप एक्सटेंशन के रूप में अतिरिक्त विधियों को जोड़ना मेरे पास एक .Net लाइब्रेरी है जो पहले से ही .Item
विधियों को कार्यान्वित कर चुकी है, उदाहरण के लिएF #
namespace Library2
type A() =
member m.Item with get(a: string) = printfn "get a string"
member m.Item with get(a: int) = printfn "simple slice"
कोड इस पुस्तकालय का उपयोग करता है में, मैं एक ही नाम के एक अतिरिक्त विधि जोड़ना चाहते हैं (इसलिए यह optional extensions
है):
#r @"Library2.dll"
open Library2
type A with
member m.Item with get(a: bool) =
printfn "get a bool"
निम्न उदाहरण की अंतिम पंक्ति संकलन नहीं है :
let a = new A()
a.["good"]
a.[10]
a.[true]
F# doc का कहना है:
एक्सटेंशन विधियां आभासी या अमूर्त विधियां नहीं हो सकती हैं। वे उसी नाम के अन्य विधियों को अधिभारित कर सकते हैं, लेकिन संकलक संदिग्ध कॉल के मामले में गैर-विस्तार विधियों की वरीयता देता है।
इसका मतलब है कि मैं उसी प्रकार के हस्ताक्षर के साथ .ToString/.GetHashCode
का विस्तार नहीं कर सकता, लेकिन यहां मैं एक अलग प्रकार के हस्ताक्षर का उपयोग करता हूं। नई विधि क्यों नहीं बढ़ाया जा सकता है? ,
public static class MyModule
{
public static void Item(this A a, bool b)
{
// whatever
}
}
संकलक .Item(...)
विधि की तलाश में है मूल Library2.A
कक्षा में यह पाता है, और विफल रहता है:
मुझे अजीब लगता है कि इंटेलिसेंस सभी तीन ओवरलोड दिखाता है। – Daniel
हां। यह मुझे भ्रमित करता है ... –