Использование метода List (Of T) .ForEach для обновления значений, которые не работают должным образом - PullRequest
3 голосов
/ 09 августа 2011

У меня есть следующий код,

PB.ForEach(Function(x) x.Cost = GetPartCost(x.PartNumber, x.Units, x.Cost, FB))

Return PB.Sum(Function(x) (x.Cost * x.Qty))

Однако он всегда возвращает 0. Я проверил, и функция GetPartCost выполняет и возвращает ненулевое число, но свойства стоимости элемента списка никогда не изменяютсяобновлено.

Свойство является простым свойством,

Public Property Cost() As Double
    Get
        Return _Cost
    End Get
    Set(ByVal value As Double)
        _Cost = value
    End Set
End Property

Если я установлю точку останова в Set свойства, оно никогда не будет получено.

Что с этим происходит?

1 Ответ

11 голосов
/ 09 августа 2011

Проблема в том, что вы путаете сравнение с заданием.

Function(x) x.Cost = GetPartCost ...

Это компилируется в сравнение между x.Cost и GetPartCost, а не назначением. Причина в том, что Function (x) является лямбда-выражением, а при использовании в контексте выражения = это сравнение, а не присвоение.

Чтобы исправить это, используйте оператор / Sub для создания семантики присваивания

Sub(x) x.Cost = GetPartCost ...

Примечание: Sub лямбды не доступны до Visual Studio 2010.

...