out var _ 和 out _ 的区别?

out var _ and out _ difference?

在 C# 7 中我们可以这样做:

byte.TryParse(p.Value, out _)

或者像这样

byte.TryParse(p.Value, out var _)

有什么不同吗?

与其他人在评论中所说的相反:不,没有区别。它们都产生完全相同的 IL。

两者都

byte.TryParse(p.Value, out _);
Console.WriteLine(_);

byte.TryParse(p.Value, out var _);
Console.WriteLine(_);

将在 C#7 中产生编译器错误,因为 _ 不打算使用。

_ 的用法不仅限于输出参数,还可以用于 returns(正如 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 _和[=18=之间有明显的句法区别].

编辑

显然我在这里不太正确。存在一些细微差别,请参阅 Ben Voigts

区别在于它们如何处理名为 _.

的现有变量
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 _ 已经有一个含义,并且该语言保持与旧含义的向后兼容性。但是 out typename identifier 是 C# 7 中的新语法,因此没有向后兼容性约束。