Свойство анонимного типа <ИмяСвойства> нельзя использовать в определении лямбда-выражения в том же списке инициализации
Обновлен: Ноябрь 2007
Anonymous type property '<propertyname>' cannot be used in the definition of a lambda expression within the same initialization list
Свойства, определенные в списке инициализации анонимного типа, не могут быть частью определения лямбда-выражения в том же списке инициализации. Например, в следующем коде свойство Num нельзя включать в определение лямбда-выражения LambdaFun.
' Not valid.
'Dim anon = New With {.Num = 4, .LambdaFun = Function() .Num > 0}
Идентификатор ошибки: BC36549
Исправление этой ошибки
Рассмотрим разделение анонимного типа на две части:
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, то ее значение изменить нельзя.
Альтернативой является использование операторов регулярных функций для обращения к свойству анонимных типов:
Function testNum(ByVal n As Integer) As Boolean Return n > 0 End Function Console.WriteLine(testNum(anon1.Num))
Аналогично, можно использовать лямбда-функции, определенные вне анонимного типа:
Dim lambdaFun1 = Function() anon1.Num > 0 Dim lambdaFun2 = Function(n As Integer) n > 0