2009-06-10 15 views
5

Estoy tratando de usar lambdas en algún código VB.Net, esencialmente estoy tratando de establecer una bandera cuando se llama a databound.Luchando con VB .net Lambdas

simplificado que se parece a esto:

Dim dropdownlist As New DropDownList() 
dropdownlist.DataSource = New String() {"one", "two"} 
Dim databoundCalled As Boolean = False 
AddHandler dropdownlist.DataBound, Function(o, e) (databoundCalled = True) 
dropdownlist.DataBind() 

Mi entendimiento es que la variable databoundCalled se debe establecer en true, claramente me falta algo como la variable permanece siempre falsa.

¿Qué debo hacer para solucionarlo?

+0

No me sorprendería que su simplificación haya eliminado el problema. ¿Podría publicar un programa corto pero * completo * que demuestre el problema? –

+0

El código que he publicado muestra el problema. – ilivewithian

Respuesta

3

sola línea Lambdas en vb.net son siempre expresiones, lo que su expresión lambda está haciendo es básicamente diciendo hace databoundCalled = Verdadero o (databoundCalled == true) si su chico # ac, no establece databoundCalled = True

+0

Muy útil, gracias (sí, soy de un fondo C#) – ilivewithian

+0

VB.Net Lambdas puede evaluar a cualquier valor, no solo como verdadero o falso. Tome la siguiente función() 42 – JaredPar

+0

Tiene razón, en el caso donde no hay un operador igual –

7

Después de revisar su código y rascarme la cabeza, encontré una solución que funciona. Ahora, por qué esto funciona sobre lo que tienes, no estoy claro. Tal vez esto al menos te ayudará en la dirección correcta. La diferencia clave es que tengo un método que establece el valor en verdadero/falso. Todo lo demás es lo mismo.

Aquí es toda mi código de proyecto web:

Partial Public Class _Default 
    Inherits System.Web.UI.Page 

    Dim databoundCalled As Boolean = False 
    Dim dropdownlist As New DropDownList() 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Response.Write(databoundCalled) 
     Bind() 
     Response.Write(databoundCalled) 

    End Sub 

    Sub Bind() 
     AddHandler dropdownlist.DataBound, Function(o, e) (SetValue(True)) 

     dropdownlist.DataSource = New String() {"one", "two"} 
     dropdownlist.DataBind() 
    End Sub 

    Function SetValue(ByVal value As Boolean) As Boolean 
     databoundCalled = value 
     Return value 
    End Function 
End Class 

espero que esto ayude!

+0

Gracias por el ejemplo, muy útil. – ilivewithian

1

El problema es cómo se interpretan las lambdas. En VS2008 una función lambda siempre se interpreta como una expresión y no como una declaración. Tomemos el siguiente bloque de código como ejemplo

Dim x = 42 
Dim del = Function() x = 32 
del() 

En este caso, el código dentro de la lambda del no está haciendo una asignación. En cambio, hace una comparación entre la variable xy el valor 32. La razón por la cual VB no tiene el concepto de una expresión que es una asignación, solo una declaración puede ser una asignación en VB.

Para realizar una tarea en una expresión lambda, debe tener capacidades de declaración. Esto no estará disponible hasta el VS2010 pero cuando es lo que puede hacer lo siguiente

Dim del = Function() 
      x = 32 
      End Function 

Básicamente cualquier cosa que no es una sola línea de lambda se interpreta como una declaración.