为什么这样按预期工作:
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)
其他人困惑吗?
当您使用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)
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 时必须小心。