为什么C#中可以一行代码调用匿名Action,而VB却不行?

3
在C#中,
(new Action(() => MessageBox.Show("Hello"))).BeginInvoke(null, null);

在VB中,翻译后的代码无法编译。
(New Action(Sub() MessageBox.Show("Hello"))).BeginInvoke(nothing, nothing)

但在VB中,我可以将BeginInvoke的结果设置为隐式变量a并运行(感谢@Ric在另一篇帖子中提出的建议)

Dim a = (New Action(Sub() MessageBox.Show("Hello"))).BeginInvoke(Nothing, Nothing)

但是现在我想知道为什么在这种情况下VB需要在左侧设置某些内容,而C#不需要。


如果你在它前面加上 Call (而不是 dim a =),它能编译吗? - J. Steen
1
如果你要报告编译错误,你应该始终显示出错信息。 - Jon Skeet
1
请注意,您不需要像这样复杂的东西来展示问题。New Random().Next()也会出错。 - Jon Skeet
感谢您的建议。幸运的是,尽管我遗漏了编译错误并提供了一个复杂的示例,但下面有一些很好的答案。 - djv
我曾经使用Delphi,但是我也有两年的VB6编程经验。这让我对任何以VB开头的东西在接下来的几个世纪里都感到厌烦。此外,在3.5推出之前,就功能而言,VB.net远远落后于C#。 - Tony Hopkinson
显示剩余5条评论
2个回答

5

VB.NET只需要一个标识符。您不能直接调用子程序或其他成员。然而,您可以使用Call代替。

通常在所调用的表达式不以标识符开头时使用Call关键字。不建议将Call关键字用于其他用途。

http://msdn.microsoft.com/en-us/library/sxz296wz(v=vs.110).aspx

Call (New Action(Sub() MessageBox.Show("Hello"))).BeginInvoke(nothing, nothing)

这个可以用。只是让我太想起VB6时代了。谢谢 :) - djv
@DanV 是的,这绝对是VB6遗留下来的传统部分之一。我自己也遇到过这个问题。最近我进入了一个VB.NET项目,并像许多其他非VB.NET开发人员一样面临了这个障碍 ;) - J. Steen

2

在VB中,不允许直接在实例化对象上调用成员函数。 请使用:

CType(New Action(Function() MessageBox.Show("Hello")), Action).BeginInvoke(Nothing, Nothing)

这个可以工作。为什么在 VB 中我们不能直接在实例化时调用成员函数,而 C# 允许呢? - djv

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