List.ForEach в vb.net - сбивает меня с толку - PullRequest
23 голосов
/ 17 января 2012

Рассмотрим следующий пример кода:

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

А этот:

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

Я ожидаю, что результаты будут такими же, однако второй пример кода НЕ меняет объекты в списке TempList.

Этот пост больше, чтобы понять, почему ...? Или, по крайней мере, получить некоторую помощь в понимании, почему ...

1 Ответ

50 голосов
/ 17 января 2012

Это потому, что вы использовали Function вместо Sub. Поскольку Function возвращает значение, компилятор считает, что знак равенства (=) используется в качестве сравнения, а не присваивания. Если вы измените Function на Sub, компилятор будет правильно рассматривать знак равенства как присвоение:

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

Если у вас была многострочная лямбда; у вас не было бы этой проблемы:

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

Очевидно, что для метода ForEach нет смысла использовать Function, поскольку возвращаемое значение не будет использоваться, поэтому вам следует использовать Sub.

...