在C#7中,我们可以这样做:
byte.TryParse(p.Value, out _)
或者像这样
byte.TryParse(p.Value, out var _)
有什么不同吗?
答案 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中的新语法,因此没有向后兼容性约束。