C#7.0丢弃参数歧义

bud*_*udi 4 c# out c#-7.0

来自https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c-7-0/:

我们允许"丢弃"作为输出参数,以_的形式,让你忽略你不关心的参数:

p.GetCoordinates(out var x, out _); // I only care about x
Run Code Online (Sandbox Code Playgroud)

请考虑以下代码:

void Foo(out int i1, out int i2)
{
    i1 = 1;
    i2 = 2;
}

int _;
Foo(out var _, out _);
Console.WriteLine(_); // outputs 2
Run Code Online (Sandbox Code Playgroud)

问题:

为什么在此上下文中输出"discard"out参数?

此外,不应该有"已定义的范围"错误out var _

int i;
Foo(out var i, out i);
Console.WriteLine(i); // Error: A local variable or function named 'i'
                      // is already defined in this scope
Run Code Online (Sandbox Code Playgroud)

ang*_*son 9

以下是详细说明丢弃行为GitHub问题,相关部分是:

但是,从语义上讲,我们希望它创建一个匿名变量,并从名为_的封闭范围中隐藏任何真实变量(例如参数或字段).
......
我们必须小心这些更改,以便任何使用_作为标识符并且今天合法的程序继续按照这些修订的规则进行编译.

_ 如果您声明并使用它,则仅表示"丢弃此参数"

  • 作为"指示符"(声明表达式)中的标识符,其中包括out元组和类似的参数和解构
  • 作为模式匹配的标识符(switch... case int _)
  • 显然也是为了声明匿名委托,必须采取参数以适应委托类型,但不需要实际参数.

out var _是其中之一.

但是,这int _;是一个单独的陈述,因此这表示您"关心"这个变量,因此它不是丢弃.

因此,您将获得具有名称的正常变量_,这仍然是合法的.这将从方法调用中获取值2,如预期的那样.