在C# 7中,我们可以这样做:
byte.TryParse(p.Value, out _)
or like this
byte.TryParse(p.Value, out var _)
有什么区别吗?
它们的区别在于如何处理一个名为_
的现有变量。
string _;
int.TryParse("123", out var _); // legal syntax for discard
int.TryParse("123", out _); // compile error, string _ is incompatible with out int parameter
或者
int _;
int.TryParse("123", out var _); // discard
Console.WriteLine(_); // error: variable is not assigned
int.TryParse("123", out _); // passes existing variable byref
Console.WriteLine(_); // ok: prints "123"
out _
已经有了一定的含义,所以这门语言要保持与旧含义的向后兼容。但是在 C# 7 中,out typename identifier
是新语法,因此没有向后兼容的限制。byte.TryParse(p.Value, out _);
Console.WriteLine(_);
byte.TryParse(p.Value, out var _);
Console.WriteLine(_);
在C#7中,使用_
将产生编译错误,因为_
并不打算被使用。
_
的使用不仅限于输出参数,还可以用于返回值(正如Evk指出的那样)。
byte.TryParse(p.Value, out var _); // I don't care about the out variable
_ = SomeMethod(); // I don't care about the return value
这里有一个很好的答案,涵盖了大多数关于省略参数的问题,在这里。
备注: 我更喜欢使用out _
而不是out var _
,因为out _
和out var 合法变量名
之间存在明显的语法区别。
编辑
显然我不是完全正确的。有一些微妙的区别,请参见Ben Voigts的答案。
_ = SomeMethod()
的作用是明确表达您不关心结果(而不是无意中忘记了它)。 它可以在任何地方使用(我的意思是只要 void Main() { _ = 123;}
编译没有问题,不需要任何 out _
等等,因此它与 out var _
块无关)。 - Evkbyte _;
。就像无论 p
是什么都必须声明一样。我以为这是默认的,但你说得对。 - Rufus L
_
在C# 7中被省略作为“out”参数。 - Paul Kertscher