2012-09-20 37 views
5

मैं पिछले हफ्ते में कई बार आ चुके हैं, और कारण जानने के लिए उत्सुक हूँ - मैं एक गूगल की थी, लेकिन कुछ भी सीधे प्रासंगिक नहीं पा सके।विधि अधिभार स्थिर + डायनामिक विफल रहता है

मैं एक गतिशील विधि के साथ एक वर्ग है, और मैं एक ही इंटरफेस के साथ एक स्थिर विधि जोड़ सकते हैं:

public class MyClass 
{ 
    public int MyMethod() 
    { 
     //do something #1; 
    } 

    public static int MyMethod() 
    { 
     //do something 
    } 
} 

यह ठीक है, लेकिन अगर मैं गतिशील विधि से स्थिर विधि कॉल करने का प्रयास करें, return MyClass.MyMethod() साथ # 1 की जगह, मैं कोई त्रुटि मिलती है "। कॉल निम्न विधियों या गुणों के बीच अस्पष्ट है: MyClass.MyMethod() और MyClass.MyMethod()
स्थिर विधि को नष्ट कर दिया है, तो त्रुटि परिवर्तन करने के लिए" एक वस्तु संदर्भ की आवश्यकता है .. "है, जो समझ में आता है।

तो क्यों इस Ambigu है ous? इसे स्थिर विधि निर्दिष्ट करने के लिए कक्षा के नाम से पहले रखा गया है, जो कोड में कहीं और से काम करता है।
क्यों नहीं?

संपादित करें: मैंने वास्तव में गतिशील विधि को कॉल करने के बिना इसे संकलित करने की कोशिश नहीं की थी, मैं बस वीएस द्वारा इसे रेखांकित नहीं कर रहा था।
लेकिन फिर भी एक ऐसी ही सवाल मुझे लगता है, लेकिन एक साथ कहा, "क्यों दोनों नहीं हो सकता है, के रूप में एक स्थिर है, और एक नहीं"

+0

आप के लिए संकलन दिया कोड है? यह मेरे लिए त्रुटि CS0111 फेंकता है (पहले से ही उसी पैरामीटर प्रकार के साथ 'MyMethod' नामक एक सदस्य को परिभाषित करता है)। – prashanth

+1

यह एक अजीब (गलत) त्रुटि संदेश है, लेकिन शायद यह उस क्रम के कारण है जिसमें संकलक संदर्भ को हल करने और सत्यापित करने का प्रयास करता है। – McGarnagle

+0

@prashanth आप सही हैं। मैंने एक धारणा की थी - संपादन देखें। – 3Pi

उत्तर

1

यहाँ इसके अलावा कुछ स्पष्टीकरण, क्यों आप एक ही हस्ताक्षर के साथ दो विधियों नहीं हो सकता दे रही है एक similar question on SO है।

The signature of a method consists of the name of the method and the type and kind (value, reference, or output) of each of its formal parameters, considered in the order left to right. The signature of a method specifically does not include the return type, nor does it include the params modifier that may be specified for the right-most parameter.

दूसरी बात:

Overloading of methods permits a class, struct, or interface to declare multiple methods with the same name, provided their signatures are unique within that class, struct, or interface.

public class MyClass 
{ 
    public int MyMethod() 
    { 
     return 0; 
    } 

    public static int MyMethod() //Here compiler says, that you've already got method MyMethod with same parameter list 
    { 
     return 0; 
    } 
} 

तो, आप सभी

पर उन तरीकों नहीं हो सकता this

पर एक नज़र सबसे पहले है संपादित करें

कारण के कारण आपको यह त्रुटि क्यों मिलती है: शायद आपने अभी तक संकलित नहीं किया है और लाल रंग के साथ एक त्रुटि को रेखांकित किया है। यदि आप संकलित करते हैं, तो आपको उस नीले रंग के साथ रेखांकित त्रुटि दिखाई देगी जहां आप अपनी स्थिर विधि को कॉल करते हैं, लेकिन उस रेखा पर जहां स्थिर विधि परिभाषित की जाती है।

+0

आपके द्वारा लिंक किए गए प्रश्न का उत्तर वह कारण है जिसे मैं ढूंढ रहा था, धन्यवाद। – 3Pi

+1

@ 3Pi एक और कड़ी है, जहां जॉन स्कीट इस व्यवहार बताते हैं: http://bytes.com/topic/c-sharp/answers/618378-static-non-static-methods-same-name-signature – horgh

0

So why is this ambiguous? It has been prefaced with the class name to specify the static method, which works from anywhere else in code. Why not here?

कारण यह अस्पष्ट है क्योंकि आप एक उदाहरण हो सकता था MyClass पर संपत्ति MyClass कहा जाता है। मेरा मानना ​​है कि एरिक लिपर्ट तर्क का वर्णन अधिक विस्तार से करता है। मुझे वह विशिष्ट पोस्ट नहीं मिल रहा है, लेकिन here is a similar series from him

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