2012-01-17 19 views
18

Consideremos el siguiente ejemplo de código:List.ForEach en vb.net - Me desconcertante

TempList.ForEach(Function(obj) 
     obj.Deleted = True 
    End Function) 

Y éste:

TempList.ForEach(Function(obj) obj.Deleted = True) 

que se puede esperar que los resultados sean los mismos, sin embargo, el segundo el ejemplo de código NO cambia los objetos en la lista TempList.

Este mensaje es más para entender por qué ...? O al menos obtener alguna ayuda para entender por qué ...

Respuesta

40

Es debido a que utilizó Function en lugar de Sub. Como un Function devuelve un valor, el compilador considera que el signo igual (=) se usa como una comparación, no como una asignación. Si cambia Function a Sub, el compilador podría considerar correctamente el signo igual como una asignación:

TempList.ForEach(Sub(obj) obj.Deleted = True) 

Si tenía una lambda de varias líneas; usted no habría tenido este problema:

TempList.ForEach(Function(obj) 
        obj.Deleted = True 
        Return True 
       End Function) 

Obviamente, para el método ParaCada que no tiene sentido utilizar un Function porque no se utilizaría el valor de retorno, por lo que debe utilizar un Sub.

+0

Ahhh tiene mucho sentido ahora, muchas gracias por eso. Todo es todavía bastante nuevo para mí :-) –

+0

Debo admitir que al principio, no sabía lo que estaba pasando bien ;-) –

+0

Estoy sorprendido de lo poderoso que este material es, obligándome a aprender esto también es LINQ. –