2012-03-05 2 views
16

가능한 중복 : 피터 p.TellYourAge()p.DoSomething()의 호출이되지 않는 이유 선택적 인수를 사용하여 C#의 이상한 동작을 설명 할 수 있습니까?

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

당신이 날 설명 할 수 :

C# optional parameters on overridden methods

이 다음 코드의 출력은 같은? 당신이 ReSharper에서를 사용하는 일이 있다면

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

내 첫번째 추측은 INT 여기에 널 (NULL)이 아니므이다 : 공공 재정의 무효 TellYourAge (INT 연령은 = -1) 기본 값을 오버라이드 (override) //, 그것은 기본은 항상 0입니다 ... – mservidio

+2

@mservidio을하지만 그 이유 기본값을 지정하십시오 –

+1

[이 기사] (http://blogs.msdn.com/b/ericlippert/archive/2011/05/09/optional-argument-corner-cases-part-one)에 관심이있을 수 있습니다. aspx) 에릭 Lippert. 정확한 사례를 설명하지는 않지만 상황에 대한 단서를 제공해야합니다. –

답변

3

, 그것은 당신에게 다음과 같은 경고/알림을 줄 것이다 : 여기

코드

은 (VS2010 및 FW 4) 스스로를 시도한다.

"선택적 매개 변수 기본값은 기본 메서드 void TellYourAge (int age)의 매개 변수 보존 기간과 다릅니다."

선택적 매개 변수 값과 상속을 혼합 할 때주의하십시오. 기본 매개 변수 값은 런타임이 아닌 컴파일 타임에 해석됩니다. 기본값은 호출되는 참조 유형에 속합니다. 여기서 Person 유형으로 해석되며 -1 대신에 0 인 정수의 기본값을 사용합니다.

현재 선택적 매개 변수에 대한 일반적인 함정에 대한 정보를 찾을 수 있습니다

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

쉽게 고쳐 당신은이 방법을 사용합니다. TellYourAge 메소드를 호출 할 때 'this'키워드를 명시 적으로 지정하십시오. 이렇게하면 컴파일시 원하는 기본값이 결정됩니다.

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

이 경우 컴파일 오류 또는 경고가 발생할 것으로 예상되지만 그게 중요한 것은 아닙니다. 컴파일시에 기본 매개 변수가 해석된다는 것도 분명하지만 p-instance의 TellYourAge()에 대한 호출이 다른 결과를 가져 오는 이유는 설명하지 않습니다. – X181

+0

참조 http://blogs.msdn.com/b/ericlippert/archive/2011/05/09/optional-argument-corner-cases-part-one.aspx –

+1

주제가 관련되어 있지만 중복되지는 않습니다. 다른 경우에는 지정된 기본값이 사용됩니다. 이 경우 유형의 지정되지 않은 기본값이 사용됩니다. – X181