2012-02-07 3 views
2

Nullable 매개 변수가있는 일반 foo 메서드를 호출 할 수 있기를 원합니다. Foo 메서드의 본문에서 Foo()를 호출하면 재귀 적으로 실행되어 스택 오버플로 (.com없이)가 발생합니다. if 문에서 호출에 런타임 유형으로 올바른 오버로드를 호출 할 수있는 방법이 있습니까?nullable param call 콘크리트 유형을 사용하는 일반 오버로드 된 메서드

나는 이름을 변경하면 그것을 이해할 수 있으며 재귀가 발생하는 이유를 알고 있지만 이것을 쓰는 다른 방법을 알지 못합니다.

감사합니다.

class Program { 
    static void Main(string[] args) { 
     int? x = 5; 
     int y = 10; 
     Foo(x, y); 
    } 

    static void Foo<T>(Nullable<T> arg, T defaultValue) where T : struct { 
     if (arg.HasValue) 
      Foo(arg.Value, defaultValue); 
    } 

    static void Foo(int arg, int defaultValue) { 
     Console.WriteLine(string.Format("I'm an int arg={0}, default={1]}", arg, defaultValue)); 
    } 

    static void Foo(string arg, int defaultValue) { 
     Console.WriteLine(string.Format("I'm an string arg={0}, default={1]}", arg, defaultValue)); 
    } 

    static void Foo(bool arg, int defaultValue) { 
     Console.WriteLine(string.Format("I'm an double arg={0}, default={1]}", arg, defaultValue)); 
    } 
} 
+1

어디에서'double? '을 기대합니까? –

+0

Foo() – logicnp

답변

1

제네릭은 컴파일 타임 기능이므로 프로그램을 실행하기 전에 과부하 해결이 결정되었습니다. 말하듯이 런타임 결정을 내리고 싶다면 dynamic을 사용하여 목표를 달성 할 수 있습니다 (C# 4 이상). 즉, int와 bool 사이의 해당 유형으로 캐스트해야합니다.

if (arg.HasValue) 
     Foo((dynamic)arg.Value, defaultValue); 

하지만주의하십시오! 이 문제는 intbool에 대해서만 해결됩니다. 다른 형식은 제네릭 메서드에 전달 될 수 있으며 이러한 메서드는 후속 호출에서 제네릭 메서드로 계속 해결됩니다. 당신이 int, stringbool는 단순히 그 오버로드를 지원하려는 경우

Foo(5.0, 10.0); // would still overflow with your given methods 

는 초기 판단을 따르십시오. 당신이 어떤 주어진 T를 지원하려는 경우, 컴파일 시간 정보에 따라 적용 할 수있는 경우

static void Foo<T>(T arg, T defaultValue) { Console.WriteLine(string.Format("I'm a T arg={0}, default={1}", arg, defaultValue)); } 

과부하 해상도는 여전히 int, bool, string, 또는 T? 과부하를 선택합니다 T.

에 대한 과부하를 만듭니다. 다른 모든 전화 인 arg.Value으로 전화를 걸면이 새로운 과부하 상태가됩니다.

+0

호출에서 인수를 명시 적으로 캐스팅 해보십시오. http://en.wikipedia.org/wiki/Double_dispatch –

+0

감사합니다. Anthony, 역동적 인 일을하고 싶습니다. 필자가 제공 한 샘플은 실제 코드가 아니기 때문에 통과 할 수있는 유형이 제한되어 있습니다. 나는 모든 방법을 하나의 일반적인 방법으로 바꾸는 당신의 생각을 좋아합니다. 내 과부하가 그것을 지원할 수 있는지 살펴볼 것입니다. 비 제너릭 메소드는 레거시 코드이므로 도입 된 새로운 코드의 양을 제한하고 싶었습니다. – user1193745

관련 문제