使用丢弃的 lambda 参数丢弃 Lambda 中的变量

问题描述 投票:0回答:1

我正在使用 .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 主体中的另一个变量。

这是编译器错误吗?我是不是误会了什么?

c# lambda .net-8.0
1个回答
0
投票

这是为了保持与旧代码的兼容性,在引入丢弃之前编写,其中

(_, x) =>
具有不同的含义:一个参数被命名为
_
,另一个参数被命名为
x

如果您仔细查看语法突出显示(嗯,至少在 Visual Studio 中),您会注意到这些情况下的颜色有所不同:

enter image description here

enter image description here

在第一种情况下,蓝色

_
表示它是上下文关键字,而在第二种情况下
_
是黄色,表示它现在是第一个参数。 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
});
© www.soinside.com 2019 - 2024. All rights reserved.