我正在使用 .NET 8.0,并且有丢弃变量的问题。
这是一个最小的例子:
using System;
using System.Threading.Tasks;
public static class Program
{
public static void Main()
{
DoThing((_, x) => // << Changing this line to discard both parameters fixes it.
{
_ = DoNothingAsync(); // << compile error here
});
}
private static void DoThing(Action<int, int> action)
{
action(1, 2);
}
private static async Task<int> DoNothingAsync()
{
await Task.Delay(200);
return 42;
}
}
这会导致上面标记的行出现编译器错误。
更改前面的注释位以丢弃两个 lambda 参数可以修复此问题,但我需要该参数。
第一个丢弃似乎知道它的类型,并且不会让我丢弃 lambda 主体中的另一个变量。
这是编译器错误吗?我是不是误会了什么?
这是为了保持与旧代码的兼容性,在引入丢弃之前编写,其中
(_, x) =>
具有不同的含义:一个参数被命名为 _
,另一个参数被命名为 x
。
如果您仔细查看语法突出显示(嗯,至少在 Visual Studio 中),您会注意到这些情况下的颜色有所不同:
与
在第一种情况下,蓝色
_
表示它是上下文关键字,而在第二种情况下 _
是黄色,表示它现在是第一个参数。 CS0029 错误也支持这一点:
Cannot implicitly convert type 'System.Threading.Tasks.Task<int>' to 'int'
在第一种情况下,我们可以确定这不会破坏任何旧代码,因为两个参数不能具有相同的名称。另请注意,您也可以通过正确命名两个参数来修复代码,因此
_
行中的 _ = DoNothingAsync()
可以再次被解释为丢弃:
DoThing((x, y) => // << Naming both parameters fixes it.
{
_ = DoNothingAsync(); // << no error, the highlight is blue again
});