2013-08-11 19 views
6

व्युत्पन्न वर्ग में "गणना" विधि होती है जो "व्युत्पन्न" वर्ग पर कुछ क्रियाएं करती है। दूसरी ओर मेरे पास एक एक्सटेंशन विधि है जो वर्ग "व्युत्पन्न" को भी लक्षित करती है।एक्सटेंशन विधि अलग क्यों व्यवहार करती है?

Derived derived = new Derived(); 
derived.Count(); 

उपरोक्त स्निपेट को कॉल करके व्युत्पन्न कक्षा के अंदर "गणना" विधि निष्पादित की जाएगी। क्यों सी # कंपाइलर चेतावनी नहीं देता है और इस स्थिति में विस्तार विधि की पहचान करता है। आंतरिक रूप से इसे कैसे ढांचा बनाते हैं?

//Base class 
public class Base 
{ 
    public virtual string Count() 
    { 
     return string.Empty; 
    } 
} 

//Derived class 
public class Derived : Base 
{ 
    public override string Count() 
    { 
     return base.Count(); 
    } 
} 

//Extension Methods for Derived class 
public static class ExtensionMethods 
{ 
    public static Derived Count(this Derived value) 
    { 
     return new Derived(); 
    } 
} 

उत्तर

6

कल्पना (§7.6.5.2) स्पष्ट रूप से कहा गया है कि उदाहरण के तरीकों विस्तार तरीकों पर प्राथमिकता दी: अगर मंगलाचरण की सामान्य प्रक्रिया लागू नहीं तरीकों पाता

, एक प्रयास की प्रक्रिया के लिए किया जाता है विस्तार विधि आमंत्रण के रूप में निर्माण।

...

पूर्ववर्ती नियमों का मतलब है कि उदाहरण के तरीकों विस्तार तरीकों से प्राथमिकता दी जाती है कि विस्तार भीतरी नाम स्थान घोषणाओं में उपलब्ध तरीकों विस्तार बाहरी नाम स्थान घोषणाओं में उपलब्ध तरीकों से प्राथमिकता दी जाती और उस एक्सटेंशन के तरीकों में सीधे घोषित नामस्थान निर्देश का उपयोग कर उसी नामस्थान में आयात किए गए विस्तार विधियों पर एक नामस्थान प्राथमिकता लेता है। उदाहरण के लिए:

यदि कोई उदाहरण विधि पारित पैरामीटर से मेल खाती है, तो एक्सटेंशन विधियों को भी नहीं माना जाता है।

+0

आप क्यों भी विवरण जोड़ना चाहते हैं। उदाहरण मैं सोच सकता हूं: अस्पष्टता को कम करना, और इसलिए आप कोर क्लास कार्यक्षमता को बदलना नहीं चाहते हैं (यानी, उस समय के दायरे में निर्दिष्ट या निर्दिष्ट समय के आधार पर आपके एक्सटेंशन 'गणना' या आवृत्ति की 'गणना' को कॉल करके) – Xcelled194

+0

यदि आप वास्तव में सामान्य की बजाय एक्सटेंशन विधि को कॉल करना चाहते हैं, आप सिंटैक्टिक चीनी का उपयोग नहीं कर सकते हैं, और सामान्य स्थैतिक विधि कॉल का उपयोग करना चाहिए: 'व्युत्पन्न व्युत्पन्न = नया व्युत्पन्न(); ExtensionMethods.Count (व्युत्पन्न); ' – Alejandro

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

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