2014-09-04 2 views
2

C# 5에서는 동적 인 메서드 매개 변수를 전달하려고 할 때 어떤 이유로 동적 결과가 발생했습니다. 동적으로 메서드를 전달할 때, 결과는 동적 표현입니다.

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic value = "John"; 
     Find<int>(value).ToList(); 
    } 

    public static IEnumerable<T> Find<T>(object value) 
    { 
     //SOME LOGIC 
     yield return default(T); //REAL RESULT 
    } 
} 

Find<T>(value)

IEnumerable<T>를 반환해야합니다. 왜 컴파일러는 동적이라고 생각합니까?
나는 이것을 Find<int>(val as object).ToList(); 해결하지만, 이해하고 싶습니다. 일까요?

+2

에릭 리 퍼트 (Eric Lippert)의 블로그 [Dynamic peragion, part one] (http://blogs.msdn.com/b/ericlippert/archive/2012/11/05/dynamic-contagion-part-one) .aspx) 및 [Dynamic contagion, part 2] (http://blogs.msdn.com/b/ericlippert/archive/2012/11/08/dynamic-contagion-part-two.aspx) – petelids

+0

@PatricHofman, 나는 'Find (value)'뒤에 점을 넣으려고하면 '동적 표현'이라는 메시지가 나타납니다. 이 작업은 런타임에 해결됩니다. ' –

+0

@olegwx : 알겠습니다. 명확한. 질문에서 그걸 놓쳤습니다. –

답변

3

찾기가 아닌 다른 방법과 일치하는 찾기가 런타임에서 실행될 수 있으므로 동적 인 경우 모든 방법이 맞는지 확인하는 등 동적 인 것이므로식이 동적 일 때마다 전체 식은 동적. 그래서 한 컴파일러는 모르는로 무엇 동적, 동적 실제로 형 sometype의라면

public static T Find<T>(sometype value) 
{ 
    return default T; 
} 

이 같은 다른 방법은 런타임에 더 적합 것이있을 수 있습니다 예를 들어

그 유형은 최상의 AT RUNTIME과 일치하는 메소드에 의해 리턴 될 수 있기 때문에 리턴 유형을 유추 할 수 없습니다.

그래서 컴파일러는 가장 좋은 방법이기 때문에 동적으로 반환한다고 말합니다. 그러나 메서드는 다른 것을 반환하지만 컴파일러는 해당 메서드가 호출되는지 여부를 아직 알지 못합니다.

+0

@PatrickHofman, @RonanThibaudau. 로난 감사합니다. 또한 결과를 반복하려고하면'var result = Find (value); '추가 정보 :'ConsoleApplication.Program. d__3 '에'ToList '에 대한 정의가 없습니다. "라는 예외가 발생합니다. 그리고 예'결과는 IEnumerable 이며'** ** **입니다. 가장 이상한 것 ... 그것은 ** 컴파일 타임이 아닙니다 ** ** 런타임 **입니다 ... –

+1

@olegwx이 역시 직관적 인 것처럼 보이지만 예상됩니다. ToList는 실제로 Enumerable.ToList (이 IEnumerable 항목)를 의미하는 확장 메서드입니다. 확장 메서드는 형식 정보에 의존하지만 형식 유추 (T가 무엇인지 알고 적절한 Generic 버전 호출)도합니다. 그것은 단순히 동적 인 것과 호환되지 않습니다. 전체적으로 당신이 동적 인 것을 오용하고 있습니다. 몇 가지 유스 케이스를 위해 거기에 있습니다. 그리고 linq은 그것들 중 하나가 아닙니다. 나는 동적 인 것으로서 바라는 최소한을 강하게 피합니다. , 모든 linq는 유형 및 입력 유추에 기반합니다. –

0

동적 유형은 컴파일 타임에는 알 수 없지만 런타임에는 알 수 없습니다. 따라서 런타임에는 문자열 유형이 될 수 있으며 다른 유형을 반환하는 찾기 (문자열 값)라는 더 나은 일치가있을 수 있습니다. 그것이 컴파일러가 당신에게 말할 수없는 이유입니다. 런타임시 해결됩니다.

관련 문제