out var _和out _差异?

时间:2018-02-15 06:20:37

标签: c# var out c#-7.0

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

byte.TryParse(p.Value, out _)

或者像这样

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

有什么不同吗?

2 个答案:

答案 0 :(得分:4)

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

两者

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

有一个很好的答案涵盖了大多数关于省略的参数here

备注:我希望out _超过out var _,因为out _out var legalVariableName之间存在明显的语法区别。

修改

显然我不太对劲。有一些微妙的差异,请参阅Ben Voigts answer

答案 1 :(得分:3)

区别在于它们如何处理名为_的现有变量。

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中的新语法,因此没有向后兼容性约束。