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