【问题标题】:Difference between lambda syntax and addressof VB.NETVB.NET的lambda语法与地址的区别
【发布时间】:2014-12-10 10:29:18
【问题描述】:

我最近进入了 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 实际上做了什么?

标签: vb.net lambda


【解决方案1】:

我不确定你出了什么问题。这是我为测试而编写的代码:

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 - 你能解释一下你在哪里通过闭包吗?我看不出Sub() Console.WriteLine("!")Sub() Navigator.NavigateTo(NavigationRoutes.DetailScreen) 之间有什么区别。除非NavigationRoutes.DetailScreen 不只是普通类型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多