[c#] 확장 방법 및 동적 개체

내 문제를 다음 코드 스 니펫으로 요약하겠습니다.

List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 };
Console.WriteLine(list.First());

위의 코드는 잘 작동합니다.

이제 다음을 시도했습니다.

dynamic dList = list;
 Console.WriteLine(dList.First());

하지만 RuntimeBinderException이 발생하는 이유는 무엇입니까?



답변

Stecya의 답변을 확장하려면 … 확장 메서드는 확장 메서드 형식의 동적 타이핑 의해 지원되지 않습니다 . 즉, 인스턴스 메서드 인 것처럼 호출됩니다. 그러나 이것은 작동합니다.

dynamic dList = list;
Console.WriteLine(Enumerable.First(dList));

물론 유용 할 수도 있고 아닐 수도 있습니다. 동적 타이핑을 사용하려는 이유와 방법에 대한 자세한 정보를 제공해 주시면 더 많은 도움을 드릴 수 있습니다.


답변

Jon의 답변을 확장하기 위해 이것이 작동하지 않는 이유는 일반적인 비 동적 코드 확장 메서드가 일치하는 확장 메서드가있는 정적 클래스에 대해 컴파일러에 알려진 모든 클래스를 전체 검색하여 작동하기 때문입니다. 검색은 네임 스페이스 중첩 및 using각 네임 스페이스에서 사용 가능한 지시문에 따라 순서대로 진행됩니다 .

즉, 동적 확장 메서드 호출을 올바르게 해결하려면 DLR이 런타임에 소스 코드에 있는 모든 네임 스페이스 중첩 및 using지시문 을 알아야 합니다 . 우리는 모든 정보를 호출 사이트에 인코딩하는 편리한 메커니즘이 없습니다. 우리는 그러한 메커니즘을 발명하는 것을 고려했지만 비용이 너무 많이 들고 그만한 가치가없는 일정 위험을 너무 많이 생성했다고 결정했습니다.


답변

때문에이 First()방법 아니다 List. Linq Extension에 정의되어 있습니다.IEnumerable<>


답변