我在这里阅读有关C#7中新的可变功能的信息。我有两个问题:
我们还允许以“”形式将“丢弃”作为输出参数_,以使您忽略不需要的参数: > p.GetCoordinates(out var x, out _); // I only care about x
我们还允许以“”形式将“丢弃”作为输出参数_,以使您忽略不需要的参数:
_
> p.GetCoordinates(out var x, out _); // I only care about x
问: 我想这只是C#7的一个信息而不是一项新功能,因为我们也可以在C#7.0之前的版本中这样做:
var _; if (Int.TryParse(str, out _)) ...
还是我在这里想念东西?
~Person() => names.TryRemove(id, out *);
*不是有效的标识符。我猜是Mads Torgersen的疏忽吗?
*
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将其视为丢弃:
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 _,然后将其视为对现有变量的引用_,如果它在范围内,例如:
out var _
out double _
out _
string _; int.TryParse("1", out _); // complains _ is of the wrong type
最后,该*符号是在有关丢弃的讨论中提早提出的,但_由于后者是其他语言中更常用的符号,因此被放弃使用。