TryParse与出var参数

C#6.0中的新特性允许在TryParse方法中声明variables。 我有一些代码:

string s = "Hello"; if (int.TryParse(s, out var result)) { } 

但是我收到编译错误: 在这里输入图像说明

我做错了什么? PS:在项目设置中设置C#6.0和.NET框架4.6。

C#6.0中的新特性允许在TryParse方法中声明variables。

声明expression式是从C#6.0中截断的,在最终版本中没有发布。 你目前不能这样做。 在GitHub上有一个关于 C#7的build议(也可以参考这个以供将来参考)。

更新(07/03/2017)

随着C#7的正式版本,下面的代码编译:

 string s = "42"; if (int.TryParse(s, out var result)) { Console.WriteLine(result); } 

只是偶然发现,在vs2017,你可以做到这一点简洁:

 if (!Int64.TryParse(id, out _)) { // error or whatever... } 

这是C#7的一个新function,这是一个非常好的function,经常与模式匹配结合使用。 C#团队博客“C#7.0中的新增function”中将公布此function以及更多function。

团队试图在这里实现的是更stream畅的代码。 你还记得有些情况下,outvariables列表变得非常长,无法使用吗? 只是一个简单的例子:

 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*/ } 

看到问题? 让所有那些坐在那里的variables无所作为是没有用的。 通过使用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*/ } 

不仅行数被最小化,也不存在不需要的variables列表。 这可以防止你使用一个你不打算使用的variables,但是现在你可以看到这个variables。

这个特性对于switch语句中的模式匹配也是很有用的,就像在这个代码中一样(它的行为与上面的代码不同):

 switch (o) { case int i: { /*use i*/ break; } case Guid g: { /*use g*/ break; } case DateTime d: { /*use d*/ break; } }