C#7.0丢弃参数模糊性

C#7.0丢弃参数模糊性,c#,out,c#-7.0,C#,Out,C# 7.0,发件人: 我们也允许“丢弃”作为输出参数,以ux的形式,让您忽略您不关心的输出参数: 考虑以下代码: void Foo(out int i1, out int i2) { i1 = 1; i2 = 2; } int _; Foo(out var _, out _); Console.WriteLine(_); // outputs 2 问题: 为什么在此上下文中输出“discard”out参数 另外,对于out var,是否应该存在“范围内已定义”错误 int i; Fo

发件人:

我们也允许“丢弃”作为输出参数,以ux的形式,让您忽略您不关心的输出参数:


考虑以下代码:

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

int _;
Foo(out var _, out _);
Console.WriteLine(_); // outputs 2

问题:

为什么在此上下文中输出“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
以下是相关部分的说明:

但是,从语义上讲,我们希望它创建一个匿名变量,并从一个名为u的封闭范围中隐藏任何真实变量(例如参数或字段)。

我们必须小心这些更改,以便任何使用uu作为标识符并且在今天是合法的程序都能继续按照这些修订规则以相同的含义编译

\
仅在声明并使用此参数时表示“放弃此参数”

  • 作为“指示符”(声明表达式)中的标识符,其中包括
    out
    参数和元组解构以及类似的
  • 作为模式匹配中的标识符(
    开关
    case int
  • 显然,这也适用于声明匿名委托,匿名委托必须采用参数才能适应委托类型,但不需要实际参数
out var
就是属于这一类别的变量之一

但是,
int\
是一个单独的语句,因此这表示您“关心”这个变量,因此它不是一个丢弃


因此,您会得到一个名为
\uu
的正常变量,该变量仍然合法。这将从方法调用中获得值2,正如预期的那样。

我认为您的代码不正确。当您调用
Foo()
时,它很可能是
Foo(out),但我可能完全误解了您的问题陈述。
\uuu
是变量的有效名称。请将其作为副本关闭。有关何时将
视为放弃以及何时不将其视为放弃的详细信息,请参阅。TL&DR:如果您将行更改为
Foo(out var,out var)
则即使
\uuu
变量在范围内,这两个参数也将被视为丢弃<代码>输出
仅在范围内没有
时被视为丢弃,否则它引用变量。
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