不能在同一个初始化列表中的 lambda 表达式定义中使用匿名类型属性“<属性名称>”

更新:2007 年 11 月

在匿名类型初始化列表中定义的属性不能是同一列表中的 lambda 表达式定义中的一部分。例如,在下面的代码中,属性 Num 不能包含在 LambdaFun 的定义中。

' Not valid.
'Dim anon = New With {.Num = 4, .LambdaFun = Function() .Num > 0}

**错误 ID:**BC36549

更正此错误

  1. 请考虑将匿名类型拆分为两部分:

    Dim anon1 = New With {.Num = 4}
    Dim anon2 = New With {.LambdaFun = Function() anon1.Num > 0}
    ' - or -
    Dim anon3 = New With {.lambdaFun = Function(n As Integer) n > 0}
    Console.WriteLine((anon2.LambdaFun)())
    Console.WriteLine(anon3.lambdaFun(anon1.Num))
    anon1.Num = -5
    Console.WriteLine((anon2.LambdaFun)())
    Console.WriteLine(anon3.lambdaFun(anon1.Num))
    

    注意,如果将 anon1.Num 声明为 Key 属性,则无法更改其值。

  2. 另外一个选择是使用常规函数语句访问匿名类型属性:

    Function testNum(ByVal n As Integer) As Boolean
        Return n > 0
    End Function
    Console.WriteLine(testNum(anon1.Num))
    
  3. 同样,可以使用在匿名类型之外定义的 lambda 函数:

    Dim lambdaFun1 = Function() anon1.Num > 0
    Dim lambdaFun2 = Function(n As Integer) n > 0
    

请参见

概念

lambda 表达式

匿名类型