使用List(Of T).ForEach方法更新未按预期工作的值

时间:2011-08-08 21:47:10

标签: vb.net lambda extension-methods anonymous-methods

我有以下代码,

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 个答案:

答案 0 :(得分:11)

这里的问题是你与作业的混淆比较。

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

这会归结为x.CostGetPartCost之间的比较而不是作业。原因是Function (x)是一个表达式lambda,当在表达式=的上下文中使用时,它是比较而不是赋值。

要解决此问题,请使用语句/ Sub来生成赋值语义

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

注意:Sub lambdas在Visual Studio 2010之前不可用。