像这样的异步 Sub
:
Dim f As Func(Of Task) = Async Sub()
End Sub
产生编译错误:
error BC36670: Nested sub does not have a signature that is compatible with delegate 'System.Func(Of System.Threading.Tasks.Task)'.
等效的 C# 代码编译良好:
Func<Task> f = async () => { };
将 Async Sub
重写为 Async Function
使代码正常工作。
为什么 Async Sub()
不能转换为返回值类型为 Task
的委托(delegate)类型?
最佳答案
VB.NET Sub
等同于 C# 返回 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
}
但是,当使用委托(delegate)时,这会变得有点困惑,因为 Foo
和 Bar
的委托(delegate)等价物看起来是一样的:async () => { }
。
唯一的区别是在 VB.NET 中,委托(delegate)看起来不一样,因为 Sub
或 Function
关键字仍然是语法的一部分。
关于vb.net - VB.NET 中的异步 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10245922/