【问题标题】:C# 7.0 discard out parameter ambiguity [duplicate]C#7.0丢弃参数歧义[重复]
【发布时间】:2017-12-02 03:57:19
【问题描述】:

来自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

考虑以下代码:

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

【问题讨论】:

  • 我认为您的代码不正确。当您拨打您的Foo() 时,它很可能是Foo(out _);,尽管我可能完全误解了您的问题陈述。
  • _ 是变量的有效名称。
  • 将此作为副本关闭。请参阅my answer to that duplicate question 了解何时将_ 视为丢弃物以及何时不被视为丢弃物的详细信息。 TL&DR:如果将行更改为Foo(out var _, out var _);,那么即使_ 变量在范围内,这两个参数都将被视为丢弃。 out _ 仅在没有 _ 在范围内时被视为丢弃,否则它引用变量。

标签: c# out c#-7.0


【解决方案1】:

这里是GitHub issue that details the behavior of discards,相关部分是:

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

_只有声明并使用时才表示“丢弃此参数”

  • 作为“指示符”(声明表达式)中的标识符,其中包括out 参数和元组的解构等类似内容
  • 作为模式匹配中的标识符 (switch ... case int _)
  • 显然也用于声明必须接受参数以适应委托类型但不需要实际参数的匿名委托。

out var _ 属于此类。

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

这样你就得到了一个名为_ 的普通变量,这仍然是合法的。正如预期的那样,这会从方法调用中获取值 2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多