2012-01-17 8 views
18

Si consideri il seguente esempio di codice:List.ForEach in vb.net - perplessi mi

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

E questo:

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

mi aspetto i risultati per essere lo stesso, ma il secondo l'esempio di codice NON cambia gli oggetti nell'elenco TempList.

Questo post è più da capire perché ...? O almeno ottenere un aiuto per capire perché ...

risposta

40

È perché hai usato Function invece di Sub. Poiché un valore Function restituisce un valore, il compilatore considera che il segno di uguale (=) viene utilizzato come confronto, non come assegnazione. Se si cambia Function al Sub, il compilatore avrebbe considerato correttamente il segno di uguale come un incarico:

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

Se tu avessi un lambda multilinea; non avrebbe avuto questo problema:

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

Ovviamente, per il metodo ForEach non ha senso utilizzare un Function perché il valore di ritorno non sarebbe stato utilizzato, così si dovrebbe utilizzare un Sub.

+0

Ahhh questo ha perfettamente senso ora, molte grazie per questo. È tutto ancora abbastanza nuovo per me :-) –

+0

Devo ammettere che all'inizio non sapevo cosa stesse succedendo ;-) –

+0

Sono stupito di quanto sia potente questa roba, costringendomi a imparare anche questo è LINQ. –