2011-02-18 11 views
8

qué puedo hacer lo siguiente:VB.NET: "Declaración de lambdas no se pueden convertir a los árboles de expresión" error de compilación tiempo

Dim qNodes As IQueryable(Of XmlNode) = xDoc.ChildNodes.AsQueryable() 
Dim test = qNodes.Where(Function(node) True) 

aunque el siguiente da el error he dicho en el título:

Dim qNodes As IQueryable(Of XmlNode) = xDoc.ChildNodes.AsQueryable() 
Dim test = qNodes.Where(Function(node) 
           Return True 
          End Function) 

?

Realmente no lo entiendo.

Respuesta

7

Esto se afirma en la sección 11.1 de la especificación VB.NET 10 Idioma:

la traducción exacta entre lambda métodos y los árboles de expresión no puede fijarse entre las versiones de la compilador y está más allá de la alcance de esta especificación. Para Microsoft Visual Basic 10.0, todas las expresiones lambda se pueden convertir en los árboles de expresión sujetos a las siguientes restricciones:

  1. sólo expresiones lambda de una sola línea y sin parámetros ByRef se pueden convertir en los árboles de expresión. De las líneas secundarias lambdas, solo las declaraciones de invocación se pueden convertir en árboles de expresiones.
  2. Las expresiones de tipo anónimo no se pueden convertir a árboles de expresiones si se usa un inicializador de campo anterior para inicializar un campo posterior inicializador, p. Nuevo con {.a = 1, .b =.a}
  3. Las expresiones del inicializador de objetos no se pueden convertir en árboles de expresión si un miembro del objeto actual que se está inicializando se usa en uno de los inicializadores de campo, p. Nuevo C1 Con {.a = 1, .b = .Method1()}
  4. Las expresiones de creación de matriz multidimensional solo se pueden convertir a árboles de expresión si declaran explícitamente su tipo de elemento .
  5. Las expresiones de enlace tardío no se pueden convertir a árboles de expresiones.
  6. Cuando una variable o campo se pasa ByRef a una expresión de invocación pero no tiene exactamente del mismo tipo que el parámetro ByRef, o cuando una propiedad se pasa ByRef, semántica normales VB son que una copia de la el argumento se pasa ByRef y su valor final se copia de nuevo en la variable o campo o propiedad. En árboles de expresión , la copia de seguridad no ocurre .

Todas estas restricciones se aplican a las expresiones anidadas lambda también.

Es la restricción en el primer elemento que se está ejecutando. La introducción deja mucho espacio para suponer que esto se trabajará en lanzamientos futuros, hay mucho que ganar, por supuesto. Connect.microsoft.com es un buen lugar para alentarlos. No pude verificar si un elemento de comentarios ya estaba abierto para esto, el sitio está desaprovechado en este momento.

11

VB.Net soporta dos tipos de expresiones lambda:

  • lambdas Expresión contienen una sola expresión e implícitamente volver la expresión.
    Por ejemplo: Function(x) x.ToString()

  • Declaración lambdas contienen una o más sentencias y deben utilizar explícitamente la palabra clave Return (si devuelven un valor)
    Estos son nuevos en VB.Net 2010.
    Por ejemplo:

    Sub(x) 
        Logger.Log(x) 
        Console.WriteLine(x) 
    End Sub 
    

El método Where, y todos los demás métodos IQueryable, ta ke expression trees.
El compilador puede compilar automáticamente expresión lambdas, pero no la declaración lambdas, en árboles de expresión.

Su segundo ejemplo intenta pasar una instrucción lambda como Expression(Of Func(Of T, Boolean)), pero el compilador no puede hacer eso.

+0

+1; [este enlace] (http://msdn.microsoft.com/en-us/library/bb397687.aspx) también es muy informativo (aunque usa la sintaxis C#) –

Cuestiones relacionadas