2012-02-19 15 views
5

इसलिए, यदि आप एफ # में सांत्वना के लिए एक लाइन बाहर लिखना चाहते हैं, तो आपको निम्न कार्यअनाम प्रक्रियाएं और एफ # में अतिभारित तरीकों

(fun line -> System.Console.WriteLine line) "foo" 

ऐसा लगता है दूसरे संस्करण की उपस्थिति से उलझन में है: वर्बोज़, लेकिन वास्तव में यह त्रुटि "विधि 'WriteLine' के लिए एक अद्वितीय अधिभार इस कार्यक्रम बिंदु से पहले प्रकार की जानकारी के आधार पर निर्धारित किया जा नहीं कर सकता है" देता है लिखने वाली विधियों को अधिभारित किया गया है जो एक स्ट्रिंग के साथ-साथ अन्य तर्क भी लेते हैं। क्या सही धारणा के साथ मेरी धारणा है?

उत्तर

12

बिल्कुल नहीं। पहले मामले में, फ़ंक्शन कॉल जानता है कि इसे एक स्ट्रिंग अक्षर पर लागू किया जा रहा है, इसलिए यह स्ट्रिंग अधिभार को खोजने के लिए ओवरलोड रिज़ॉल्यूशन कर सकता है।

दूसरे मामले में, line अतिभारित WriteLine विधि करने के लिए कॉल के बिंदु पर अनुमान टाइप करने के लिए एक अनसुलझी प्रकार चर रहा है, तो यह पता नहीं है जो लेने के लिए ओवरलोड, और यह स्ट्रिंग तर्क नहीं देखा गया है फिर भी, जैसा कि प्रकार अनुमान बाएं से दाएं है।

"foo" |> (fun line -> System.Console.WriteLine line) 

और यह काम करेंगे करने के लिए बदलें यह है, क्योंकि line के लिए प्रकार निष्कर्ष चर "foo" में आने से string के साथ एकीकृत कर दिया जाएगा, पहले यह WriteLine कॉल निर्धारित करने के लिए की जरूरत है।

तो वे कुंजी बाएं से दाएं प्रकार की अनुमान है; एक प्रकार परिवर्तनीय के समाधान की अनुपस्थिति में, अभी तक एक अधिभार चुनना संभव नहीं हो सकता है।

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