vb.net - VB.NET 中的异步 lambda 表达式

标签 vb.net lambda async-await

像这样的异步 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# 返回 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
}

但是,当使用委托(delegate)时,这会变得有点困惑,因为 FooBar 的委托(delegate)等价物看起来是一样的:async () => { }

唯一的区别是在 VB.NET 中,委托(delegate)看起来不一样,因为 SubFunction 关键字仍然是语法的一部分。

关于vb.net - VB.NET 中的异步 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10245922/

相关文章:

.net - VB.NET动态插件组件

.net - 我可以在项目/解决方案级别上设置Option Explicit和Option Strict吗?

vue.js - Vuex 中的异步/等待操作

c++ - 过滤范围、lambda 和 is_sorted

c# - 如何将 Expression<Func<T, DateTime>> 转换为 Expression<Func<T, object>>

c# - MongoDB 无尽的查找 ToListAsync

c# - 使用 Single InstanceContextMode 在 WCF 服务上调用异步方法

c# - 将以下 C# 示例转换为 VB.NET

c# - 需要一个通过 USB 端口控制的 Switch 组件

java - 在此示例中,lambdas 和引用方法如何工作?