2015-04-14 5 views
5

के बीच अस्पष्ट है क्यों मुझे एक ही हस्ताक्षर के साथ स्थिर और गैर स्थैतिक तरीकों की अनुमति नहीं है?कॉल निम्न विधियों या गुणों (एक स्थैतिक और एक गैर स्थैतिक)

चलो कहते हैं कि मैं इस

public class TestClass 
{ 
    public object thing { get; set; } 

    public TestClass() 
    { 

    } 

    public TestClass(object thing) 
    { 
     this.thing = thing; 
    } 

    public static TestClass ConvertTestClass(object thing) 
    { 
     return new TestClass(thing); 
    } 

    public TestClass ConvertTestClass(object thing) 
    { 
     this.thing = thing; 
     return this; 
    } 


} 

की तरह एक वर्ग करते हैं और मैं इस

public class SomeOtherClass 
{ 
    public SomeOtherClass() 
    { 
     TestClass tc = TestClass.ConvertTestClass(new object()); 

     TestClass tc2 = new TestClass(); 
     tc2.ConvertTestClass(new object()); 
    } 
} 

मैं TestClass.ConvertTestClass(new object());

पर निम्नांकित त्रुटियाँ कॉल है मिल की तरह उपयोग करने का प्रयास करें निम्न विधियों या गुणों के बीच संदिग्ध: 'TestClass.ConvertTestClass (ऑब्जेक्ट)' और 'TestClass.ConvertTestClass (ऑब्जेक्ट)'

और पर tc2.ConvertTestClass(new object());

कॉल इन त्रुटियों को निम्न विधियों या गुणों के बीच अस्पष्ट है: 'TestClass.ConvertTestClass (वस्तु)' और 'TestClass.ConvertTestClass (वस्तु)'

सदस्य 'TestClass.ConvertTestClass (ऑब्जेक्ट)' को एक इंस्टेंस संदर्भ से एक्सेस नहीं किया जा सकता है; इसके बजाय

क्या संकलक वास्तव में उस विधि के स्थिर और गैर स्थैतिक संस्करणों के बीच अंतर नहीं बता सकता है या क्या मुझे यहां कुछ याद आ रहा है?

मैं रीशेपर का उपयोग नहीं कर रहा हूं (जो अन्य प्रश्नों में एक समान समस्या की जड़ लग रहा था)।

+3

आप 'TestClass' के अंदर से 'ConvertTestClass (new object())' के साथ क्या कहने की उम्मीद करेंगे? ;) लेकिन अंत में यह स्पष्टता के लिए शायद एक डिजाइन निर्णय था। – Marvin

+0

@ मारविन जो निश्चित रूप से संदिग्ध होगा। लेकिन, यह कहकर 'यह नहीं होगा। ConvertTestClass' या' TestClass.ConvertTestClass' अस्पष्टता को हल करता है? कभी-कभी हमें संकलक के लिए इस प्रकार की स्पष्टीकरण करने के लिए कहा जाता है ('System.Windows.Shapes.Path'/'System.IO.Path') – Brad

+1

इस पर एक नज़र डालें [answer] (http://stackoverflow.com/ए/6033530/3052062) जॉन स्कीट द्वारा – chomba

उत्तर

4

यह आपको एक त्रुटि दे रहा है, इसलिए यह एक सुरक्षित शर्त है कि संकलक दो तरीकों के बीच नहीं समझ सकता है, या नहीं।

यह शायद किसी भी प्रकार के अधिभार को करने का एक बुरा विचार है, क्योंकि यह स्पष्ट नहीं है कि आप किस विधि का आह्वान करना चाहते हैं, लेकिन यदि यह पर्याप्त नहीं है, तो सी # 5 विनिर्देश इस तरह के एक विधि हस्ताक्षर को परिभाषित करता है (धारा 3.6) :

एक विधि के हस्ताक्षर विधि, प्रकार पैरामीटर की संख्या और प्रकार और प्रकार (मूल्य, संदर्भ या उत्पादन) इसकी औपचारिक मानकों में से प्रत्येक के, के नाम पर विचार किया के होते हैं दाएं को दाएं से बाएं ऑर्डर करें। इन उद्देश्यों के लिए, विधि का कोई भी प्रकार पैरामीटर औपचारिक पैरामीटर के प्रकार में होता है इसकी पहचान नाम से नहीं की जाती है, लेकिन विधि की प्रकार तर्क सूची में इसकी सामान्य स्थिति द्वारा। किसी विधि के हस्ताक्षर में विशेष रूप से रिटर्न प्रकार, पैराम संशोधक शामिल नहीं है जो दाएं-अधिकतर पैरामीटर के लिए निर्दिष्ट किया जा सकता है, न ही वैकल्पिक प्रकार पैरामीटर बाधाएं।

यह स्पष्ट रूप से static का उल्लेख नहीं करता है, लेकिन इसमें इसे "हस्ताक्षर" की परिभाषा के हिस्से के रूप में भी शामिल नहीं किया गया है। इस प्रकार, यह निष्पक्ष मानने के लिए कि spec द्वारा, एक विधि अधिभार केवल इस तथ्य में भिन्न नहीं हो सकता है कि यह स्थैतिक या instanced है।

+0

धारा 7.6.4 और धारा 10.6.2 * लगता है * संकलक सुझाव देने के लिए अलग बता सकते हैं। मेरा मतलब है कि यह नियमित रूप से 'this.thing = चीज़; 'की अनुमति है। – Brad

+0

@ ब्रैड अब उनको पढ़ रहा है, लेकिन मैंने कभी नहीं कहा कि कंपाइलर समझ में नहीं आया कि कैसे 'स्थिर' काम करता है, बस यह अधिभार के प्रयोजनों के लिए हस्ताक्षर का हिस्सा नहीं था। – BradleyDotNET

+0

हाँ, मैंने सुना है। यह सिर्फ "जिस तरह से है" होने की संभावना है। – Brad

0

मैं इसे एक टिप्पणी के रूप में लिखूंगा हालांकि इस बिंदु को उचित संपादक में बनाना आसान है।

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

public class MyClass 
{ 
    public static void HellowWorld() 
    { 
     Console.WriteLine("Hello World!"); 
    } 

    public void HellowWorld() 
    { 
     Console.WriteLine("Howdy World!"); 
    } 

    public void Greet() 
    { 
     HellowWorld(); 
    } 
} 

इस प्रकार की है। आपको टिप्पणी की गई विधि को वैकल्पिक करने और कक्षा को सफलतापूर्वक संकलित करने में सक्षम होना चाहिए। यह इंगित करना कि वर्ग के दायरे में कौन सी विधि को बुलाया जाना चाहिए, अलग करने का कोई तरीका नहीं है।

आप तर्क दे सकते हैं कि कक्षा के भीतर आपको एक बाहरी विधि के रूप में एक स्थिर विधि को कॉल करने के लिए उसी वाक्यविन्यास का उपयोग करने के लिए मजबूर होना चाहिए जैसे आप बाहरी रूप से करते हैं।

हालांकि, इस दौरान सी # इस्तेमाल किया तर्क देखते हुए अवहेलना होगी, तुम क्यों एक वर्ग के भीतर वर्ग के नाम निर्दिष्ट करने की आवश्यकता चाहिए? मुझे लगता है कि इस तरह के बदलाव से अस्पष्टता भी पैदा होगी जहां कोई नहीं था, और ऐसा करने के लिए अब निश्चित रूप से वहां बहुत सारे कोड तोड़ दिए जाएंगे।

मुझे लगता है कि संकलक तर्क यह सही समझ में आता है।

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