2015-10-22 10 views
5

मान लीजिए कि मैं निम्न विधि को परिभाषित किया है दो:प्रकार अनुमान विसंगति

int ReturnNumber(int number) 
{ 
    return number; 
} 

अब मान लें कि मैं भी निम्न दो विधियों में परिभाषित किया गया है सकते हैं; एक नियमित रूप से विधि:

void Print(Func<int, int> function)

और एक विस्तार विधि:

static void Print(this Func<int, int> function)

मैं इस तरह पूर्व कॉल कर सकते हैं:

Print(ReturnNumber); // Regular method call, seems to implicitly convert ReturnNumber to Func<int, int>

लेकिन मैं ऐसा नहीं कर सकते कि बाद वाले के साथ:

ReturnNumber.Print(); // Extension method call, does not seem to do the implicit conversion -- results in compiler error

हालांकि मैं ऐसा कर सकते हैं:

((Func<int, int>)ReturnNumber).Print(); // I perform the conversion explicitly

मैं यह सोचते हैं रहा हूँ वहाँ है कि कुछ "जादू" होता है कि जब आप किसी अन्य विधि के लिए एक तर्क के रूप में एक विधि पारित, और कहा कि इसलिए संकलक यह अनुमान लगाने में सक्षम है कि इसे ReturnNumber को Func<int, int> में परिवर्तित करने का प्रयास करना चाहिए, जबकि कंपाइलर विस्तार विधियों के लिए ऐसी कोई काम नहीं करता है। क्या ये सही है? मेरे प्रश्न को संक्षेप में सारांशित किया जा सकता है: आप किसी विधि पर एक्सटेंशन विधि क्यों नहीं कॉल कर सकते हैं, जबकि आप किसी प्रतिनिधि उदाहरण पर एक्सटेंशन विधि को कॉल कर सकते हैं? क्या इस तथ्य के साथ कुछ करने के लिए कुछ है कि संकलक वस्तुओं के रूप में विधियों का इलाज नहीं करता है, लेकिन केवल प्रतिनिधियों को वस्तुओं के रूप में व्यवहार करता है?

उत्तर

5

विधि समूह परोक्ष Func<int, int> को परिवर्तित, जिसे आप एक स्थान है, जहां एक Func<int, int> की उम्मीद है (जैसे कि यह एक तरीका है जो पैरामीटर है करने के लिए पारित करके के रूप में में है कि विधि समूह उपयोग कर रहे हैं Func<int, int> तो यह सक्षम है का मतलब है हो सकता है कि इसे इस तरह के एक प्रतिनिधि में बदलने के लिए।

लेकिन जब तक आप वास्तव में उस विधि समूह को Func<int, int> में परिवर्तित नहीं कर लेते हैं, तब तक आप किसी भी उदाहरण विधि को कॉल नहीं कर सकते हैं, क्योंकि इसमें कोई भी नहीं है। जब आप इसे स्पष्ट रूप से Func<int, int> पर डाल देते हैं आप एक अभिव्यक्ति समूह (जो स्वयं Func<int, int> नहीं है) से Func<int, int> में उस अभिव्यक्ति को बदल रहे हैं।

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