2012-01-17 15 views
18

Rozważmy następujący przykład kodu:List.ForEach w VB.NET - kłopotliwy mi

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

i ten:

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

spodziewałbym wyniki być taka sama, natomiast drugi przykład kodu NIE zmienia obiektów na liście TempList.

Ten wpis jest bardziej zrozumiały, dlaczego ...? Albo przynajmniej pomóż zrozumieć, dlaczego ...

Odpowiedz

40

To dlatego, że użyłeś Function zamiast Sub. Ponieważ Function zwraca wartość, kompilator uważa, że ​​znak równości (=) jest używany jako porównanie, a nie przydział. Jeżeli zmienisz Function do Sub, kompilator będzie poprawnie pod znakiem równości jako zadanie:

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

Jeśli miał multilinii lambda; byś nie miał tego problemu:

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

Oczywiście, dla metody ForEach nie ma sensu używać Function ponieważ wartość zwracana nie zostaną wykorzystane, więc należy użyć Sub.

+0

Ahhh, teraz ma to sens, wielkie dzięki za to. To wszystko jest dla mnie zupełnie nowe :-) –

+0

Muszę przyznać, że na początku też nie wiedziałem, co się dzieje ;-) –

+0

Jestem zdumiony tym, jak potężne są te rzeczy, zmuszając się do nauki tego również to LINQ. –