2011-04-29 3 views
3

아직 4.0으로 업그레이드하지 않은 경우 코드 스 니펫을 직접 확인했을 것입니다. 그러나 일부 전문가가 이에 대해 의견을 나눌 수 있기를 바랍니다.C에서 과부하 및 동적 키워드

다음 코드에서 런타임에 적절한 Print() 메서드를 호출 할 예정입니까? C# 2010에서 그렇게 부르는 것이 합법적입니까?

public void Test() 
{ 
    dynamic objX = InstantiateAsStringOrDouble(); 

    Print(objX); 
} 

public void Print(string s) 
{ 
    Console.Write("string"); 
} 

public void Print(double n) 
{ 
    Console.Write("double"); 
} 

고마워요!

+0

어떻게하면 인쇄하기를 결정할까요? 나는 당신이'동적'에 대해 더 잘 읽는 것이 낫다고 생각합니다. 물론 런타임에 –

+0

. 귀하의 조언을 주셔서 감사합니다, 나는 이미 그것을하고 있어요! :-) –

+1

작동하지만 동적 인 것에주의하십시오. 그것은 많은 이슈들을 해결할 수 있고 동시에 많은 두통을 줄 수 있습니다 :-) 기본적으로 런타임 유연성을 얻지 만 모든 컴파일러 시간 검사를 잃어 버립니다. –

답변

3

예, 실제로 작동합니다. 런타임에 동적 사용을 확인하고 적절한 메소드를 호출하지만 컴파일 시간을 거의 다 잃어 버릴 수 있으므로 실제로 그렇게하고 싶습니다.

+0

James에게 감사드립니다. 변환하려는 코드는 boxed Object 매개 변수를 전달하는 3-4 단계의 deep 메소드 호출을 사용합니다. 나는 오버로드 된 메소드를 작성하려고했지만 if-else 로직, 메소드 호출, 다른 메소드 호출보다 더 많은 if-else 로직 (2-3 레벨에서 오는 동일한 Object 매개 변수 전달)을 생각했습니다. 목의 레거시 코드. Object가 ArrayList인지 아니면 HashTable인지 또는 그에 따라 작동하는지 확인합니다. –

2

네, 그리고 당신도이 작업을 수행 할 수 있습니다

public dynamic InstantiateAsStringOrDouble() { return 0.5; } 

또는

public dynamic InstantiateAsStringOrDouble() { return "hello"; } 

및 예상대로 작동합니다.

+2

그리고 물론'public dynamic ... {true true; }'아마 작동하지 않습니다. –