TryParse with out var 参数
TryParse with out var param
C# 6.0 中的一项新功能允许在 TryParse 方法中声明变量。
我有一些代码:
string s = "Hello";
if (int.TryParse(s, out var result))
{
}
但是我收到编译错误:
我做错了什么?
P.S.: 在项目设置中设置了C# 6.0和.NET framework 4.6。
A new feature in C# 6.0 allows to declare variable inside TryParse
method.
声明表达式从 C# 6.0 中删除,未在最终版本中发布。你目前不能这样做。 There is a proposal for it on GitHub for C# 7 (also see this 供以后参考)。
更新 (07/03/2017)
随着C#7的正式发布,编译以下代码:
string s = "42";
if (int.TryParse(s, out var result))
{
Console.WriteLine(result);
}
这是 C# 7 的一个新特性,这是一个非常好的特性,经常与模式匹配结合使用。此功能以及更多功能已在 C# 团队博客 What’s New in C# 7.0.
中公布
团队在这里试图实现的是更流畅的代码。您还记得一些 out 变量列表变得非常长而无用的情况吗?举个简单的例子:
int i;
Guid g;
DateTime d;
if (int.TryParse(o, out i)) { /*use i*/ }
else if (Guid.TryParse(o, out g)) { /*use g*/ }
else if (DateTime.TryParse(o, out d)) { /*use d*/ }
看到问题了吗?让所有这些输出变量坐在那里什么都不做是没有用的。使用 C# 7 可以将行数减半:
if (int.TryParse(o, out int i)) { /*use i*/ }
else if (Guid.TryParse(o, out Guid g)) { /*use g*/ }
else if (DateTime.TryParse(o, out DateTime d)) { /*use d*/ }
不仅减少了行数,而且在范围内也没有您不想拥有的不必要的变量列表。这可以防止您使用您不打算使用但现在对您可见的变量。
此功能对于 switch
语句中的模式匹配也很有用,例如这段代码(其行为与上述代码不同!):
switch (o)
{
case int i: { /*use i*/ break; }
case Guid g: { /*use g*/ break; }
case DateTime d: { /*use d*/ break; }
}
无意中发现,在vs2017中,为了简洁可以这样做:
if (!Int64.TryParse(id, out _)) {
// error or whatever...
}
C# 6.0 中的一项新功能允许在 TryParse 方法中声明变量。 我有一些代码:
string s = "Hello";
if (int.TryParse(s, out var result))
{
}
但是我收到编译错误:
我做错了什么? P.S.: 在项目设置中设置了C# 6.0和.NET framework 4.6。
A new feature in C# 6.0 allows to declare variable inside TryParse method.
声明表达式从 C# 6.0 中删除,未在最终版本中发布。你目前不能这样做。 There is a proposal for it on GitHub for C# 7 (also see this 供以后参考)。
更新 (07/03/2017)
随着C#7的正式发布,编译以下代码:
string s = "42";
if (int.TryParse(s, out var result))
{
Console.WriteLine(result);
}
这是 C# 7 的一个新特性,这是一个非常好的特性,经常与模式匹配结合使用。此功能以及更多功能已在 C# 团队博客 What’s New in C# 7.0.
中公布团队在这里试图实现的是更流畅的代码。您还记得一些 out 变量列表变得非常长而无用的情况吗?举个简单的例子:
int i;
Guid g;
DateTime d;
if (int.TryParse(o, out i)) { /*use i*/ }
else if (Guid.TryParse(o, out g)) { /*use g*/ }
else if (DateTime.TryParse(o, out d)) { /*use d*/ }
看到问题了吗?让所有这些输出变量坐在那里什么都不做是没有用的。使用 C# 7 可以将行数减半:
if (int.TryParse(o, out int i)) { /*use i*/ }
else if (Guid.TryParse(o, out Guid g)) { /*use g*/ }
else if (DateTime.TryParse(o, out DateTime d)) { /*use d*/ }
不仅减少了行数,而且在范围内也没有您不想拥有的不必要的变量列表。这可以防止您使用您不打算使用但现在对您可见的变量。
此功能对于 switch
语句中的模式匹配也很有用,例如这段代码(其行为与上述代码不同!):
switch (o)
{
case int i: { /*use i*/ break; }
case Guid g: { /*use g*/ break; }
case DateTime d: { /*use d*/ break; }
}
无意中发现,在vs2017中,为了简洁可以这样做:
if (!Int64.TryParse(id, out _)) {
// error or whatever...
}