You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 8 Lambda含单个丢弃参数时的丢弃变量编译错误问题

问题解析:Lambda参数中的_与丢弃变量的区别

这不是编译器Bug,核心是混淆了C#中两种不同场景下_的含义:

  1. Lambda参数列表中的单个_是普通参数名
    当你写(_, x) => ...时,这里的_并不是丢弃符号,而是一个名称为_的int类型参数(对应Action<int, int>的第一个参数类型)。此时在Lambda体内写_ = DoNothingAsync(),本质是尝试给这个int类型的参数赋值,但DoNothingAsync()返回Task<int>,类型不匹配,因此触发编译错误。

  2. Lambda参数列表中的多个_才是丢弃参数
    当你把参数写成(_, _)时,C#编译器会将其识别为真正的丢弃参数——此时_不再代表具体的变量,只是用来表示“我不需要这个参数”的语法符号。这种情况下,Lambda体内的_ = DoNothingAsync()会被解析为新的丢弃变量,和参数无冲突,因此编译通过。

可行的解决方案

方案1:重命名Lambda的第一个参数

给不需要的参数取一个明确的非_名称,避免和体内的丢弃变量冲突:

public static void Main()
{
    DoThing((unused, x) => {
        _ = DoNothingAsync(); // 此处的_是真正的丢弃变量,编译正常
    });
}

方案2:改用异步委托(推荐)

如果你的逻辑需要异步执行,应该将DoThing的委托类型从Action<int, int>改为Func<int, int, Task>,同时使用async Lambda来处理异步操作:

public static void Main()
{
    DoThing(async (_, x) => {
        await DoNothingAsync(); // 直接await处理异步返回值,无需丢弃
        // 或者也可以写 _ = await DoNothingAsync();
    });
}

private static async Task DoThing(Func<int, int, Task> action)
{
    await action(1, 2);
}

注意:如果必须保持同步委托签名,强行用_ = DoNothingAsync().Wait()虽然能编译,但会阻塞线程,不建议在生产代码中使用。

内容的提问来源于stack exchange,提问作者David Crowell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:24:58