2010-08-12 8 views
6

그래서 저는 C#을 배워서 이상한 것을 발견했습니다 ... 저는 대표자와 놀고 있는데 대표단을 만들었습니다 DelegateReturnsInt. 나는 foreach는 루프를 사용하면 이제,이 책은 다음과 같이 사용하는 방법을 보여줍니다 :명시 적/암시 적 재정의없이 foreach 캐스트는 어떻게 수행됩니까?

지금
foreach(DelegateReturnsInt del in theDelegate.getInvocationList()) 

내가 getInvocationList()가 위임 []의 배열을 반환하는 것을 알고 있지만 로 변환 않는 방법 DelegateReturnsI 번에? 난 그냥 놀러와 for 루프에 foreach 문에서 변경을 원하기 때문에 내가 물어, 그래서 나는이

Delegate[] del = theDelegate.GetInvocationList(); 
for(int i = 0; i < del.Length; i++){ 
    int result = del[i](); 

를 만들었지 만 그 방법으로 델 [i]는 표시되지 않습니다. 나는 DelegateReturnsInt 등으로 캐스팅을 시도했지만 정의되지 않은 캐스팅 유형 오류를 제공합니다.

내 큰 질문은 foreach()가 그렇게 특별한 이유가 무엇입니까?

답변

11

암시 적 캐스트를 수행합니다 (방출 된 일리노이를 보면 알 수 있습니다). 이것은 또한 당신이 말한 것이 아닌 경우에 그 라인에 예상치 못한 캐스트 예외가 발생할 수 있음을 의미합니다.

+0

위임자 [] del = theDelegate.GetInvocationList(); for (int i = 0; i Nicholas

+0

https://connect.microsoft.com/VisualStudio/feedback/details/530748/new-fxcop-rule-for-net2-on-foreach-in-generic-ienumerable – Guillaume

+0

예, 있습니다. 'foreach'에 "보이지 않는"또는 "암시 적"캐스트가 있습니다 (정말로 권장하는'foreach'에서'var'을 사용하는 경우 제외). 이 형 변환은 보이지 않지만 암시 적 유형 변환과 명시 적 유형 변환 모두에서 작동합니다. 예를 들어 기본 형식 인 'Delegate'에서 파생 형식 인 'DelegateReturnsInt'(다운 캐스트) 로의 참조 변환은 C# 용어로 _explicit 참조 변환입니다. 따라서 "보이지 않는"캐스트는 명시 적 변환에서도 작동합니다 (런타임 또는 코스에서 'InvalidCastException'을 throw 할 수 있음). –

관련 문제