苦苦挣扎VB .net Lambdas

时间:2009-06-10 08:11:08

标签: vb.net lambda

我正在尝试在一些VB.Net代码中使用lambdas,本质上我是在调用数据绑定时尝试设置标志。

简化它看起来像这样:

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()

我的理解是databoundCalled变量应该设置为true,显然我遗漏了一些东西,因为变量总是保持为假。

我需要做些什么来解决它?

3 个答案:

答案 0 :(得分:7)

在查看代码并摸不着头脑之后,我找到了一个有效的解决方案。现在,为什么这对你所拥有的东西起作用,我不清楚。也许这至少会帮助你朝着正确的方向前进。关键的区别是我有一个方法将值设置为true / false。其他一切都是一样的。

这是我的整个网络项目代码:

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

我希望这有帮助!

答案 1 :(得分:3)

vb.net中的单行Lambdas总是表达式,你的lambda表达式正在做的基本上是说databoundCalled = True或(databoundCalled == True)如果你是一个c#guy,没有设置databoundCalled = True

答案 2 :(得分:1)

问题在于如何解释lambdas。在VS2008中,函数lambda始终被解释为表达式而不是语句。以下面的代码块为例

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

在这种情况下,lambda del中的代码不进行赋值。而是在变量x和值32之间进行比较。原因是VB没有表达式的赋值概念,只有一个语句可以是VB中的赋值。

为了在lambda表达式中进行赋值,您必须具有语句功能。这将在VS2010之前无法使用,但是当它可以执行以下操作时

Dim del = Function()
           x = 32
          End Function

基本上任何不是单行lambda的东西都被解释为语句。