2012-04-20 58 views
2

异步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的委托类型?

回答

4

VB.NET Sub相当于C#返回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关键字仍然是其中的语法的一部分。

+0

VB.NET'Function'实际上意味着某些值将从方法返回。在上面的代码中没有返回值,所以lambda-'Function'实际上应该是lambda-'Sub“。你有没有在VB.NET中看到没有'Return'语句的'Function'? – ControlFlow 2012-04-20 12:14:08

+0

@ControlFlow C#等价物确实返回一个值,并且该值是一个“任务”。该任务的返回是隐含的:你没有'return'语句,但你确实返回了一些东西。在VB.NET中是一样的。 – hvd 2012-04-20 12:15:52

+1

@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