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