VB.NET中lambda语法和addressof的区别

3

我最近进入了VB.NET的世界,但是我无论如何都弄不清楚为什么以下代码不起作用。

当我写下这段代码时,一切正常:

MyNavigationCommand = New RelayCommand(AddressOf Navigate)

Private Sub Navigate()
    Navigator.NavigateTo(NavigationRoutes.DetailScreen)
End Sub

然而,当我尝试使用lambda表达式完全相同的方式时,当我点击触发命令的按钮时,我的lambda内部的代码并没有被执行。

以下行不起作用:

MyNavigationCommand = New RelayCommand(Sub() Navigator.NavigateTo(NavigationRoutes.DetailScreen))

这应该与我的先前方法完全相同,不是吗?或者我错过了什么?


Navigator.NavigateTo 是一个共享子程序还是依赖于某个属性?而 NavigateTo 实际上是做什么的? - Allan S. Hansen
1个回答

0

我不确定你遇到了什么问题。这是我编写的用于测试的代码:

Sub Main

    Dim MyNavigationCommand = New RelayCommand(AddressOf Navigate)
    Dim MyNavigationCommand2 = New RelayCommand(Sub() Console.WriteLine("!"))

    Navigate
    MyNavigationCommand
    MyNavigationCommand2

End Sub

Public Delegate Sub RelayCommand

Public Sub Navigate()
    Console.WriteLine("!")
End Sub

运行此代码会生成三行


就像你所说,这样做一些简单的事情是可以运行的。但是,当你将一个闭包传递给 RelayCommand 的 Action 时,它就不再起作用了。我已经解决了这个问题,它与 MVVM Light 的 RelayCommand 如何处理传递给命令的 lambda 中捕获变量有关。实现自己的 ICommand 并传递一个捕获的变量就可以解决问题。很奇怪。 - Mirage
@Mirage - 你能解释一下你在哪里传递了一个闭包吗?我没有看到Sub() Console.WriteLine("!")Sub() Navigator.NavigateTo(NavigationRoutes.DetailScreen)之间的区别。除非NavigationRoutes.DetailScreen不仅仅是一个普通类型? - Enigmativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接