没有执行函数(x)的VB.NET Linq表达式?

Bai*_*ock 4 linq vb.net

为什么这样按预期工作:

list.ForEach(sub(x) x.Name = "New Name")
Run Code Online (Sandbox Code Playgroud)

但这不是:

list.ForEach(function(x) x.Name = "New Name")
Run Code Online (Sandbox Code Playgroud)

其他人困惑吗?

slo*_*oth 5

当您使用Function关键字时

list.ForEach(Function(x) x.Name = "New Name")
Run Code Online (Sandbox Code Playgroud)

您正在创建一个函数,该函数接受一个名为的参数x并返回一个bool(在本例中).

因此,在这种情况下,=不是赋值运算符,而是比较运算符,因此Name属性不会更改.(编译器推断该函数bool由于比较运算符而返回a )

它相当于

list.ForEach(sub(x) Foobar(x))

...

Function Foobar(x as Foo) As Boolean
    Return x.Name = "New Name" 'returns a boolean'
End Function
Run Code Online (Sandbox Code Playgroud)


Jim*_*ley 4

List(Of T).ForEach 将不返回值的 Action (Sub) 而非返回值的 Func (Function) 作为参数。

在 VB 中,= 符号是不明确的。它可以用于比较或赋值。为了消除该语句的歧义,x.Name = "New Name"团队使用了 Sub 或 Function 指示符来确定这是比较还是赋值。在 的情况下Sub(x) x.Name = "New Name",您正在执行分配,或将 x 的 Name 参数的值设置为“New Name”。如果Function(x) x.Name = New "Name"您正在进行比较并返回 x 的名称参数是否与“新名称”相同。因此,使用 Sub 和 Function 时必须小心。