将异步 lambda 方法分配给 C# 和 VB.NET 中类型为任务的变量

2023-11-21

这在 C# 中可能吗?以下代码会产生编译器错误。

HashSet<Task<(string Value, int ToNodeId)>> regionTasks =
  new HashSet<Task<(string Value, int ToNodeId)>>();
foreach (Connection connection in Connections[RegionName])
{
    regionTasks.Add(async () =>
    {        
        string value = await connection.GetValueAsync(Key);
        return (value, connection.ToNode.Id);
    }());
}

C# 编译器抱怨,“错误 CS0149:需要方法名称。”它无法推断 lambda 方法的返回类型。

请注意我在 lambda 块关闭 {} 后立即通过 () 调用 lambda 方法的技术。这确保了Task被返回,而不是Func.

VB.NET 编译器理解此语法。我惊讶地发现 VB.NET 编译器胜过 C# 编译器的示例。看我的VB 胜过 C# 的异步 Lambda 编译器错误完整故事的博客文章。

Dim regionTasks = New HashSet(Of Task(Of (Value As String, ToNodeId As Integer)))
For Each connection In Connections(RegionName)
    regionTasks.Add(Async Function()
        Dim value = Await connection.GetValueAsync(Key)
        Return (value, connection.ToNode.Id)
    End Function())
Next

VB.NET 编译器理解End Function()技术。它正确推断 lambda 方法的返回类型是Function() As Task(Of (Value As String, ToNodeId As Integer))因此调用它会返回一个Task(Of (Value As String, ToNodeId As Integer))。这可分配给regionTasks多变的。

C# 要求我将 lambda 方法的返回值转换为Func,这会产生极其难以辨认的代码。

regionTasks.Add(((Func<Task<(string Values, int ToNodeId)>>)(async () =>
{
    string value = await connection.GetValueAsync(Key);
    return (value, connection.ToNode.Id);
}))());

糟糕的。括号太多了!我在 C# 中能做的最好的事情就是显式声明一个Func,然后立即调用它。

Func<Task<(string Value, int ToNodeId)>> getValueAndToNodeIdAsync = async () =>
{
    string value = await connection.GetValueAsync(Key);
    return (value, connection.ToNode.Id);
};
regionTasks.Add(getValueAndToNodeIdAsync());

有没有人找到更优雅的解决方案?


If .NET Standard 2.1(或某些 .NET Framework 版本,请参阅兼容性列表) 可供您使用,您可以将 LINQ 与ToHashSet method:

var regionTasks = Connections[RegionName]
    .Select(async connection => 
    {        
        string value = await connection.GetValueAsync(Key);
        return (Value: value, ToNodeId: connection.ToNode.Id);
    })
    .ToHashSet();

或者只是初始化HashSet与相应的IEnumerable.

UPD

评论中链接的另一个解决方法answer:

static Func<R> WorkItOut<R>(Func<R> f) { return f; }

foreach (Connection connection in Connections[RegionName])
{
    regionTasks.Add(WorkItOut(async () =>
    {        
        string value = await connection.GetValueAsync(Key);
        return (value, connection.ToNode.Id);
    })());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将异步 lambda 方法分配给 C# 和 VB.NET 中类型为任务的变量 的相关文章

  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • 以相反的顺序迭代可变参数模板参数

    如果我手动反转传递给它的模板参数的顺序 以下代码将起作用 template
  • MVC 重定向到没有控制器的视图

    希望应该是一个简单的 我创建了一个通用错误视图 当整个站点的操作方法内发生异常时 我想显示该视图 我创建了一个部分页面 所有导航都位于其中 因此我不需要在此视图上使用控制器 那么如何从控制器内的操作方法重定向到它 像这样的东西 HttpPo
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 为什么派生类不使用基类的operator=(赋值运算符)?

    以下是实际问题的简化版本 而不是打电话Base operator int 代码似乎生成了一个临时的Derived对象并复制它 既然函数签名似乎完美匹配 为什么不使用基本赋值运算符 这个简化的示例没有显示任何不良影响 但原始代码在析构函数中有
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 更改其他页面的主窗口内容

    在 WPF 应用程序的主窗口中 我有一个 Badged 元素 来自材料设计 这是我的代码
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐

  • 如何在 Android O 中动态更改通知声音

    最近我使用通知通道来支持android O 但问题是我无法动态更改声音 Uri 我们的应用程序有通知声音设置 用户可以根据需要更改应用程序通知声音 但如您所知 Android 现在不允许开发者在用户重新安装应用程序之前更新通知渠道 我在那里
  • JDBC:将日期值插入 MySQL

    我想知道如何使用 Java JDBC 将日期值设置到 MySQL 数据库 以下是我的代码 String lastCrawlDate 2014 01 28 PreparedStatement p con prepareStatement in
  • node.js 将变量暴露给模块?

    我读过很多关于如何在 Node js 中创建模块的文章 您可以使用 module exports 将模块内部公开到包含它的文件中 太棒了 反过来又是如何运作的呢 我将使用以下示例 USER JS function User this pro
  • 在 C# 中获取所有控制器和操作名称

    是否可以以编程方式列出所有控制器的名称及其操作 我想为每个控制器和操作实现数据库驱动的安全性 作为一名开发人员 我知道所有控制器和操作 并且可以将它们添加到数据库表中 但是有什么方法可以自动添加它们吗 下面将提取控制器 操作 属性和返回类型
  • 从字符串创建类的实例

    有没有一种方法可以根据我在运行时知道类的名称这一事实来创建类的实例 基本上我会将类的名称放在字符串中 看看激活器 CreateInstance method
  • 内容变化引起的过渡元素大小

    我有一个按钮 里面有一些文字 当您按下它时 文本会发生变化 这使得按钮的宽度发生变化 如果可以通过如下方式来转换元素宽度的变化 那就太好了 el transition width 150ms ease out 当然 只有当您明确更改widt
  • 记录我的网站上的超链接点击

    我有一个网站 允许其他开发人员在其中托管内容 我的目标是记录页面上存在的每个超链接 甚至是其他开发人员托管的内容 的点击次数 我最初的方法如下 a click function event do my logging return true
  • 计算 3 点 (x,y) 的曲率

    我有一个二维欧几里得空间 给出三点 例如 p2是中间点 Point2D p1 new Point2D Double 177 289 Point2D p2 new Point2D Double 178 290 Point2D p3 new P
  • 将 fullcalendar 与 webpack 结合使用

    我使用 npm webpack 和 FullCalendar 但是在使用 fullcalendar 时 我在浏览器控制台中收到以下错误 main js 37556 Uncaught TypeError 0 jquery2 default f
  • 图像对话框 - 扩展 onOk,而不是完全覆盖

    我发现我可以挂钩onOk有了这个 editor on dialogShow function ev var name ev data getName var definition ev data definition if name ima
  • YouTube 嵌入动态尺寸(最小和最大尺寸)

    我想将 YouTube 视频嵌入到网站中 该视频的最小分辨率为 256 144 像素 最大分辨率为 1280 x 720 像素 我想将嵌入视频限制为上面给定的分辨率 我已经找到了动态 YouTube 嵌入的示例 但其中一些只有最小宽度 如果
  • 如何确保只有一个 PHP 脚本实例通过 Apache 运行?

    我有一个index php我在 Google 代码网站上用作提交后 URL 的脚本 该脚本克隆一个目录并构建一个可能需要一些工作的项目 我想避免让这个脚本并行运行多次 如果另一个脚本已经在会话中 我可以使用一种机制来避免执行该脚本吗 您可以
  • 将日期与 Graphview 库一起使用

    我正在使用 GraphView 库 请参阅 https github com jjoe64 GraphView or http www jjoe64 com p graphview library html 但我想使用日期 时间作为 X a
  • C 中的内存段——文本段

    有人可以告诉我什么是 C 中的 文本段 如果可能的话 给我看一个简单的例子 Unix 系统上程序的 文本 段是代码 机器代码 组成程序的函数 特别包括 main 如果程序是用 C 或 C 编写的 它还可以包含只读数据 经典程序中的其他段是
  • R 中的 3D 绘图 - 使用第四维颜色

    我正在使用plot3d函数在我的R脚本中绘制3D图 我想添加第四个维度 即颜色 我怎样才能做到这一点 具体来说 假设我有以下代码 plot3d x y z col cols size 2 type s 我将如何填充cols基于作为我的第四维
  • 如何在 Xcode 4 中每次构建(运行)iOS 应用程序之前自动运行 OCUnit 逻辑测试?

    It seems that I have everything set up correctly When I run command U or select Product gt Test from menu my test runs f
  • 如何使用代码设置 ImageView 的重力(或边距)?

    我想将 ImageView 添加到具有重力或边距的 FrameLayout 中 但 FramLayout 和 ImageView 没有相关的方法 实际上 我找不到 选择Framelayout的原因是为了将ImageView放在ImageVi
  • VB.Net Power 运算符 (^) 从 C# 重载

    我正在编写一个暴露给 VB Net 的 C 类 我想重载vb net 运算符 这样我就可以写 Dim c as MyClass Set c New Dim d as MyClass Set d c 2 在 C 中 运算符是xor运算符和幂运
  • SQL Server 上的数据库数量过多算多少?

    我正在使用一个应用程序 我们将每个客户端的客户端数据存储在单独的 SQL 数据库中 到目前为止 这种方法效果很好 甚至出现了一些错误代码从数据库中选择了错误客户 ID 的情况 并且由于数据库中唯一的数据属于该客户 因此造成的损害并没有想象的
  • 将异步 lambda 方法分配给 C# 和 VB.NET 中类型为任务的变量

    这在 C 中可能吗 以下代码会产生编译器错误 HashSet