Борьба с VB .net Lambdas - PullRequest
       19

Борьба с VB .net Lambdas

5 голосов
/ 10 июня 2009

Я пытаюсь использовать лямбды в некотором коде VB.Net, по сути, я пытаюсь установить флаг, когда вызывается привязка данных.

Упрощенно это выглядит так:

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 ]

7 голосов
/ 10 июня 2009

Просмотрев ваш код и почесав голову, я нашел решение, которое работает. Теперь, почему это работает над тем, что у вас есть, мне не ясно. Может быть, это по крайней мере поможет вам в правильном направлении. Основное различие заключается в том, что у меня есть метод, который устанавливает значение 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

Надеюсь, это поможет!

3 голосов
/ 10 июня 2009

Однострочные лямбды в vb.net ВСЕГДА являются выражениями, то, что делает ваше лямбда-выражение, в основном говорит, делает ли databoundCalled = True или (databoundCalled == True), если вы парень c #, не установлен databoundCalled = True

1 голос
/ 10 июня 2009

Проблема в том, как интерпретируются лямбды. В VS2008 лямбда-функция всегда интерпретируется как выражение, а не как выражение. Возьмите следующий блок кода в качестве примера

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

В этом случае код внутри лямбда-дель не выполняет присваивание. Вместо этого он выполняет сравнение между переменной x и значением 32. Причина в том, что VB не имеет понятия выражения, которое является присваиванием, только утверждение может быть присваиванием в VB.

Чтобы выполнить присваивание в лямбда-выражении, у вас должны быть возможности операторов. Это не будет доступно до VS2010, но когда это произойдет, вы можете сделать следующее

Dim del = Function()
           x = 32
          End Function

По сути, все, что не является одной строкой лямбды, интерпретируется как утверждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...