在 C# 7 中,我们可以这样做:
byte.TryParse(p.Value, out _)
Run Code Online (Sandbox Code Playgroud)
或者像这样
byte.TryParse(p.Value, out var _)
Run Code Online (Sandbox Code Playgroud)
有什么区别吗?
不同之处在于它们如何处理名为 的现有变量_。
string _;
int.TryParse("123", out var _); // legal syntax for discard
int.TryParse("123", out _); // compile error, string _ is incompatible with out int parameter
Run Code Online (Sandbox Code Playgroud)
或者
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"
Run Code Online (Sandbox Code Playgroud)
这样做的原因是它out _已经有了一个含义,并且该语言保持了与旧含义的向后兼容性。但是out typename identifier是 C# 7 中的新语法,因此没有向后兼容性约束。
与其他人在评论中所说的相反:不,没有区别。它们都产生完全相同的 IL。
两个都
byte.TryParse(p.Value, out _);
Console.WriteLine(_);
Run Code Online (Sandbox Code Playgroud)
和
byte.TryParse(p.Value, out var _);
Console.WriteLine(_);
Run Code Online (Sandbox Code Playgroud)
使用 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
Run Code Online (Sandbox Code Playgroud)
有一个很好的答案,占地约ommitted参数大部分东西在这里。
备注:我宁愿out _过out var _,因为之间有明显的语法区别out _和out var legalVariableName。
编辑
显然我不完全正确。有一些细微的差异,请参阅 Ben Voigts 的回答。