2010-08-12 15 views
6

Así que estoy aprendiendo C#, y encontré algo que me parece extraño ... Estoy jugando con delegados y he creado un delegado DelegateReturnsInt. Ahora, Cuando utilizo un bucle foreach, el libro muestra a utilizar de esta manera:¿Cómo se proyecta Foreach sin anulaciones explícitas/implícitas?

foreach(DelegateReturnsInt del in theDelegate.getInvocationList()) 

ahora sé que getInvocationList() devuelve una matriz de Delegado [], pero ¿cómo convertirlos a DelegateReturnsInt? Lo pregunto porque quería simplemente jugar y cambiarlo de un foreach para un bucle, así que creé este

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

pero eso no veo del [i] como método. He intentado convertir a DelegateReturnsInt y tal, pero me da errores de tipo de conversión sobre no tenerlo definido.

Mi gran pregunta es ¿por qué Foreach() es tan especial?

Respuesta

11

Hace un lanzamiento implícito (si miras el IL emitido, lo verás). Esto también significa que podrías obtener una excepción de lanzamiento inesperado en esa línea si no es lo que dices que es.

+0

Delegado [] del = theDelegate.GetInvocationList(); para (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

Sí exactamente, hay un elenco "invisible" o "implícito" presente en un 'foreach' (excepto si usa' var' en el 'foreach' que realmente recomiendo). Este envío es invisible, pero funciona con conversiones de tipo implícito y conversiones de tipo explícito. Por ejemplo, la conversión de referencia del tipo base "Delegar" al tipo derivado "DelegateReturnsInt" (un downcast) es una conversión _explicit reference_ en la terminología C#. Por lo tanto, el elenco "invisible" también funciona para conversiones explícitas (puede arrojar 'InvalidCastException' en tiempo de ejecución o curso). –

Cuestiones relacionadas