异步lambda表达式中VB.NET
问题描述:
异步Sub
这样的:异步lambda表达式中VB.NET
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
的委托类型?
答
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
}
然而,这变得有点多混乱的时候使用的代表,因为Foo
和Bar
委托等价物看起来是一样的:async() => { }
。
唯一的区别是,在VB.NET中,代表看起来不一样,因为Sub
或Function
关键字仍然是其中的语法的一部分。
VB.NET'Function'实际上意味着某些值将从方法返回。在上面的代码中没有返回值,所以lambda-'Function'实际上应该是lambda-'Sub“。你有没有在VB.NET中看到没有'Return'语句的'Function'? – ControlFlow 2012-04-20 12:14:08
@ControlFlow C#等价物确实返回一个值,并且该值是一个“任务”。该任务的返回是隐含的:你没有'return'语句,但你确实返回了一些东西。在VB.NET中是一样的。 – hvd 2012-04-20 12:15:52
@hvd我认为问题是,虽然C#'async'关键字用于将'void'函数的声明转换为'Func',但在VB.NET中出现'Async' ** not **宣布一个“Sub”成同样的东西。请注意,在C#示例中,我们可以采用'()=> {}'(它不返回任何内容,因此对应于VB.NET'Sub'),并通过预先将其分配给'Func ' 'async' - 类似的过程出现* not *在VB.NET中工作。无论如何,我认为这是个问题。 –
AakashM
2012-04-20 12:22:53