像这样的异步
Sub
:Dim f As Func(Of Task) = Async Sub()
End Sub
产生编译错误:
错误 BC36670: 嵌套的子程序没有与委托 'System.Func(Of System.Threading.Tasks.Task)' 兼容的签名。
等效的 C# 代码可以编译通过:
Func<Task> f = async () => { };
将 Async Sub
重写为 Async Function
可以使代码正常运行。
为什么 Async Sub()
不能转换为返回类型为 Task
的委托类型?
async
关键字将void
函数的声明转换为Func<Task>
,但在 VB.NET 中,Async
似乎不会将Sub
的声明转换为相同的东西。请注意,在 C# 示例中,我们可以使用() => {}
(它不返回任何内容,因此对应于 VB.NET 的Sub
)并通过在前面添加async
将其分配给Func<Task>
- 类似的过程似乎不适用于 VB.NET。我想这就是问题所在。 - AakashMTask<T>
的异步函数中,你不会返回一个Task<T>
,而是返回一个T
:async Task<int> Foo() { return 1; }
- user743382IEnumerable<int> M() { yield return 1; }
时,您不会返回任何内容,但会yield一个整数。您不会返回一系列整数--您没有返回任何东西--而是生成一个整数序列。编译器会处理重写为返回IEnumerable<int>
的方法。异步方法也是这样。如果异步方法返回一个Task<int>
,那么您将返回一个整数,而编译器将其转换为返回Task<int>
的方法。 - Eric Lippert