为什么匿名Action可以在C#中的一行中调用而不是VB?

时间:2013-01-15 23:25:39

标签: c# .net vb.net

在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#则没有。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

VB不允许直接在实例化上调用成员调用。 使用:

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