2010-08-12 12 views
6

Ben sadece C# öğreniyorum ve garip bulduğum bir şeye rastladım ... Delegeler ile çalışıyorum ve DelegateReturnsInt delegesi oluşturdum. Ben foreach döngü kullandığınızda Şimdi, kitap bu gibi kullanmak gösterir:Foreach açık/kapalı geçersiz kılma olmadan nasıl yayınlanır?

şimdi
foreach(DelegateReturnsInt del in theDelegate.getInvocationList()) 

Ben getInvocationList() Delegesi [] bir dizi döndürdüğünü biliyorum, ama bu onları dönüştürmek demek nasıl DelegateReturnsInt? Etrafa oynamak ve döngü için bir foreach onu değiştirmek istediği için ben sormak, bu yüzden bu

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

oluşturulan ama bu bir yöntem olarak del [i] görmez. Ben DelegateReturnsInt için döküm denedim ve böyle, ancak tanımlanmamış olmasıyla ilgili tür hataları veriyor.

Büyük sorum, foreach() özelliğini bu kadar özel yapan şey nedir?

cevap

11

Gizli bir yayın yapar (yayılan IL'ye bakarsanız, görürsünüz). Bu aynı zamanda, söylediğiniz şey değilse, o satırda beklenmeyen bir özel durum istisnası alabileceğiniz anlamına da gelir.

+0

Delege [] del = theDelegate.GetInvocationList(); (Int i = 0; i Nicholas

+0

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

+0

Evet, tam olarak, "foreach" içinde bir "görünmez" veya "örtülü" yayınlanmış (gerçekten de önerdiğim foreach'da 'var' seçeneğini kullanmanız dışında). Bu yayın görünmez, ancak hem örtülü tür dönüşümleri hem de açık tür dönüşümleri ile çalışır. Örneğin, "Delegate" taban türünden türetilen "DelegateReturnsInt" türüne (bir downcast) yapılan dönüşüm dönüşümü, C# terminolojisinde bir _explicit referans dönüşümüdür. Yani "görünmez" kadro, açık dönüşümler için de çalışır (InvalidCastException'ı çalışma zamanında veya derste atabilir). –