一尘不染

C#7:在Out变量中使用下划线(_)和星号(*)

c#

我在这里阅读有关C#7中新的可变功能的信息。我有两个问题:

  1. 它说

我们还允许以“”形式将“丢弃”作为输出参数_,以使您忽略不需要的参数:

>     p.GetCoordinates(out var x, out _); // I only care about x

问: 我想这只是C#7的一个信息而不是一项新功能,因为我们也可以在C#7.0之前的版本中这样做:

    var _;
if (Int.TryParse(str, out _))
...

还是我在这里想念东西?

  1. 当我在同一博客中提到时,我的代码给出了一个错误:
    ~Person() => names.TryRemove(id, out *);
    

*不是有效的标识符。我猜是Mads Torgersen的疏忽吗?


阅读 1385

收藏
2020-05-19

共1个答案

一尘不染

C#7中的Discards可以在声明变量的任何地方使用,以顾名思义,可以丢弃结果。因此,可以将out与变量一起使用:

p.GetCoordinates(out var x, out _);

它可以用来丢弃表达式结果:

_ = 42;

在这个例子中

p.GetCoordinates(out var x, out _);
_ = 42;

没有_引入任何变量。只有两种情况使用了丢弃。

但是,如果_范围中存在标识符,则不能使用丢弃:

var _ = 42;
_ = "hello"; // error - a string cannot explicitly convert from string to int

例外是将_变量用作输出变量时。在这种情况下,编译器将忽略该类型或var将其视为丢弃:

if (p.GetCoordinates(out double x, out double _))
{
    _ = "hello"; // works fine.
    Console.WriteLine(_); // error: _ doesn't exist in this context.
}

请注意,这种情况仅在使用out var _或的情况下发生out double _。只需使用out _,然后将其视为对现有变量的引用_,如果它在范围内,例如:

string _;
int.TryParse("1", out _); // complains _ is of the wrong type

最后,该*符号是在有关丢弃的讨论中提早提出的,_由于后者是其他语言中更常用的符号因此被放弃使用

2020-05-19