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...
}