2012-03-05 13 views
16

संभव डुप्लिकेट:क्या आप वैकल्पिक तर्कों के साथ सी # के इस अजीब व्यवहार को समझा सकते हैं?

Peter: -1 
Peter: 0 
Fred: 1 
Fred: 1 

तुम मुझे बता सकते हैं क्यों पीटर p.TellYourAge() और p.DoSomething() की कॉल नहीं है:
C# optional parameters on overridden methods

यह निम्नलिखित कोड का उत्पादन होता है समान?

यहाँ कोड यह अपने आप का प्रयास करने के (VS2010 और परिवार कल्याण 4):

static void Main(string[] args) 
    { 
     Peter p = new Peter(); 
     p.TellYourAge(); // expected -1, result: -1 
     p.DoSomething(); // expected -1, result: 0 

     Fred f = new Fred(); 
     f.TellYourAge(1); // expected 1, result: 1 
     f.DoSomething(); // expected 1, result: 1 

     Console.ReadKey(); 
    } 
} 

public abstract class Person 
{ 
    public abstract void TellYourAge(int age); // abstract method without default value 
} 

public class Peter : Person 
{ 
    public override void TellYourAge(int age = -1) // override with default value 
    { 
     Console.WriteLine("Peter: " + age); 
    } 

    public void DoSomething() 
    { 
     TellYourAge(); 
    } 
} 

public class Fred : Person 
{ 
    public override void TellYourAge(int age) // override without default value 
    { 
     Console.WriteLine("Fred: " + age); 
    } 

    public void DoSomething() 
    { 
     TellYourAge(1); 
    } 
} 
+2

मेरा पहला अनुमान है कि पूर्णांक यहां नल नहीं है, क्योंकि यह है: सार्वजनिक ओवरराइड शून्य TellYourAge (पूर्णांक उम्र = -1) // डिफ़ॉल्ट मान के साथ ओवरराइड, यह डिफ़ॉल्ट हमेशा 0 है है ... – mservidio

+2

@mservidio लेकिन इसका कारण यही है आप डिफ़ॉल्ट मान –

+1

निर्दिष्ट करते हैं, आपको [इस आलेख] में दिलचस्पी हो सकती है (http://blogs.msdn.com/b/ericlippert/archive/2011/05/09/optional-argument-corner-cases-part-one। एएसपीएक्स) एरिक लिपर्ट द्वारा। यद्यपि यह सटीक उसी मामले का वर्णन नहीं करता है, यह आपको क्या हो रहा है इसके बारे में कुछ संकेत देना चाहिए। –

उत्तर

3

आप Resharper उपयोग करने के लिए होता है, तो यह आपको निम्न चेतावनी/अधिसूचना दे देंगे।

"वैकल्पिक पैरामीटर डिफ़ॉल्ट मान बेस विधि शून्य में पैरामीटर आयु से अलग है TellYourAge (int आयु)।"

जब आप वैकल्पिक पैरामीटर मान और विरासत को मिलाते हैं तो देखें। डिफ़ॉल्ट पैरामीटर मान संकलित समय पर हल नहीं होते हैं, रनटाइम नहीं। डिफ़ॉल्ट संदर्भ प्रकार से संबंधित है। यहां यह व्यक्ति प्रकार के लिए हल हो जाता है और यह एक पूर्णांक के डिफ़ॉल्ट मान का उपयोग करता है जो 0 के बजाय 0 है।

आप यहाँ वैकल्पिक पैरामीटर के बारे में सामान्य कठिनाइयों के बारे में कुछ जानकारी पा सकते हैं:

http://geekswithblogs.net/BlackRabbitCoder/archive/2010/06/17/c-optional-parameters---pros-and-pitfalls.aspx

आसान ठीक आप इसे इस तरह से उपयोग करना चाहते हैं। विधि TellYourAge को कॉल करते समय स्पष्ट रूप से कीवर्ड 'यह' निर्दिष्ट करें। इस तरह वांछित डिफ़ॉल्ट मान संकलन समय पर निर्धारित किया जाएगा।

public void DoSomething() 
{ 
    this.TellYourAge(); 
} 
+1

मैं इस मामले में संकलन त्रुटि या चेतावनी की अपेक्षा करता हूं, लेकिन यह बात नहीं है। कि डिफ़ॉल्ट पैरामीटर संकलित समय पर हल किए गए हैं, यह भी स्पष्ट है, लेकिन यह समझा नहीं जाता है कि पी-इंस्टेंस परिणामों पर TellYourAge() को बिल्कुल समान कॉल क्यों अलग-अलग आउटपुट में परिणाम देता है। – X181

+0

यह भी देखें http://blogs.msdn.com/b/ericlippert/archive/2011/05/09/optional-argument-corner-cases-part-one.aspx –

+1

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

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

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