2010-08-12 9 views
6

Also lerne ich gerade C#, und stieß auf etwas, das ich seltsam finde ... Ich spiele mit Delegierten und habe einen Delegierten DelegateReturnsInt. Wenn ich jetzt eine foreach Schleife verwenden, zeigt das Buch es wie folgt zu verwenden:Wie wird fereach ohne explizite/implizite Überschreibungen umgesetzt?

foreach(DelegateReturnsInt del in theDelegate.getInvocationList()) 

jetzt weiß ich, dass GetInvocationList() gibt ein Array von Delegierten [], aber wie es sie zu konvertiert DelegierenReturnsInt? Ich frage, weil ich um nur spielen wollte und es für Schleife eines von einer foreach zu ändern, so dass ich schaffte diesen

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

aber das bedeutet nicht sieht del [i] als Methode. Ich habe versucht, DelegateReturnsInt und so zu werfen, aber es gibt mir Gussfehler über nicht definiert zu haben.

Meine große Frage ist, was macht foreach() so besonders?

Antwort

11

Es macht eine implizite Besetzung (wenn Sie die emittierte IL betrachten, würden Sie es sehen). Dies bedeutet auch, dass Sie eine unerwartete Cast-Ausnahme in dieser Zeile erhalten könnten, wenn dies nicht das ist, was Sie sagen.

+0

Delegieren [] del = theDelegate.GetInvocationList(); für (int i = 0; i Nicholas

+0

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

+0

Ja genau, gibt es eine "unsichtbare" oder "implizite" Besetzung in einer "foreach" (außer wenn Sie 'var' in der' foreach' verwenden, die ich wirklich empfehle). Diese Umwandlung ist unsichtbar, funktioniert jedoch sowohl mit impliziten Typkonvertierungen als auch mit expliziten Typkonvertierungen. Zum Beispiel ist die Referenzkonvertierung vom Basistyp 'Delegate' zum abgeleiteten Typ' DelegateReturnsInt' (ein Downcast) eine _explizite Referenzkonvertierung_ in C# -Terminologie. Daher funktioniert die "unsichtbare" Umwandlung auch für explizite Konvertierungen (sie können 'InvalidCastException' zur Laufzeit oder zum Kurs auslösen). –

Verwandte Themen