.NET 8 Lambda含单个丢弃参数时的丢弃变量编译错误问题
问题解析:Lambda参数中的
_与丢弃变量的区别 这不是编译器Bug,核心是混淆了C#中两种不同场景下_的含义:
Lambda参数列表中的单个
_是普通参数名
当你写(_, x) => ...时,这里的_并不是丢弃符号,而是一个名称为_的int类型参数(对应Action<int, int>的第一个参数类型)。此时在Lambda体内写_ = DoNothingAsync(),本质是尝试给这个int类型的参数赋值,但DoNothingAsync()返回Task<int>,类型不匹配,因此触发编译错误。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
相关产品推荐
相关产品推荐

