2017-04-12 5 views
6

एफ # अतिभारित केवल उदाहरण के लिए, एक वैकल्पिक पैरामीटर द्वारा अलग करने के लिए कार्यों की अनुमति देता है:वैकल्पिक पैरामीटर के साथ च # अतिभारित कार्यों के बीच भेद

type MyClass() = 
    member this.func(a: string, b:string) = "func(a,b)" 
    member this.func(a: string, ?b:string) = "func(a,?b)" 

आपने सबसे पहले समारोह कहेंगे?

+1

आप बस किसी भी समारोह में दूसरा पैरामीटर नाम बदल सकते हैं: 'प्रकार MyClass() = सदस्य this.func (क : स्ट्रिंग, बी: स्ट्रिंग) = "func (a, b)" सदस्य this.func (a: string,? c: string) = "func (a,? c)" परीक्षण = MyClass() arg1 = "2" दें arg2 = "12" test.func (arg1, b = arg2) |> printfn "% s" // func (a, b) test.func (arg1, c = arg2) |> printfn "% s" // func (a,? c) ' –

उत्तर

8

मुझे नहीं लगता कि पहले फंक्शन को कॉल करने का एक समझदार तरीका है यदि दो ओवरलोड किए गए फ़ंक्शंस केवल वैकल्पिक पैरामीटर से भिन्न होते हैं। जैसा कि टिप्पणियों में बताया गया है, इसका उपयोग शायद एक खराब डिजाइन है और आपको पैरामीटर का नाम बदलना चाहिए।

त्रुटि FS0041: विधि 'समारोह' कर सकता है के लिए एक अद्वितीय अधिभार

आप शायद देखा के रूप में, जब आप MyClass().func("A","B") का उपयोग कर एक साधारण तरीके से समारोह से कॉल करके, आप अस्पष्टता के बारे में शिकायत एक त्रुटि संदेश मिलता इस कार्यक्रम बिंदु से पहले प्रकार की जानकारी के आधार पर निर्धारित नहीं किया जाना चाहिए। एक प्रकार की टिप्पणी की आवश्यकता हो सकती है। उम्मीदवारों: सदस्य MyClass.func: एक: स्ट्रिंग * ख: स्ट्रिंग -> स्ट्रिंग, सदस्य MyClass.func: एक: स्ट्रिंग * ख: स्ट्रिंग -> स्ट्रिंग

आप दूसरे अधिभार स्पष्ट रूप से दो तरह से कॉल कर सकते हैं (?b के साथ या बिना) तथ्य यह है कि आप स्पष्ट रूप से एक वैकल्पिक तर्क के लिए Some मूल्य प्रदान कर सकते हैं करने के लिए धन्यवाद:

MyClass().func("A") 
MyClass().func("A",?b=Some "B") 
जिज्ञासा से बाहर

, यह पता चला है कि आप एक स्थिर सदस्य बाधा के माध्यम से पहले अधिभार कॉल कर सकते हैं। यह काफी बदसूरत है और आप शायद यह नहीं करना चाहिए, लेकिन यह पहला अधिभार कॉल:

let inline callFunc (o:^T) a b = 
    (^T : (member func : string * string -> string) (o, a, b)) 

callFunc (MyClass()) "A" "B" 
संबंधित मुद्दे