VB.NET中的异步lambda表达式

时间:2012-04-20 12:06:05

标签: vb.net lambda async-await

像这样异步Sub

Dim f As Func(Of Task) = Async Sub()
                         End Sub

产生编译错误:

  

错误BC36670:嵌套的sub没有与委托'System.Func(Of System.Threading.Tasks.Task)'兼容的签名。

等效C#代码编译良好:

Func<Task> f = async () => { };

Async Sub重写为Async Function使代码生效。

为什么Async Sub()无法转换为返回值类型为Task的委托类型?

1 个答案:

答案 0 :(得分:4)

VB.NET Sub相当于C#returns voidasync void Foo() {}async Task Foo() {}之间存在差异,而您的VB.NET正在执行前者,而您需要后者。正如你所提到的,Async Function使它成功,因为它实际上是后者。

编辑:更多细节:

C#:

async void Foo() { }

async Task Bar() { }

void Baz()
{
    object dummy;
    dummy = (Action) Foo; // OK
    dummy = (Func<Task>) Foo; // error
    dummy = (Action) Bar; // error
    dummy = (Func<Task>) Bar; // OK
}

但是,当使用委托时,这会更加混乱,因为FooBar的委托等价物看起来相同:async () => { }

唯一的区别是在VB.NET中,代理看起来不一样,因为SubFunction关键字仍然是语法的一部分。