2

像这样异步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 SubAsync Functionmake 代码有效。

为什么Async Sub()不能转换为返回值为 type 的委托类型Task

4

1 回答 1

4

VB.NETSub相当于 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 中,委托看起来不一样,因为SuborFunction关键字仍然是那里的语法的一部分。

于 2012-04-20T12:10:27.700 回答