像这样异步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
的委托类型?
答案 0 :(得分:4)
VB.NET Sub
相当于C#returns void
。 async 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
}
但是,当使用委托时,这会更加混乱,因为Foo
和Bar
的委托等价物看起来相同:async () => { }
。
唯一的区别是在VB.NET中,代理看起来不一样,因为Sub
或Function
关键字仍然是语法的一部分。