TryParse没有var param

Ant*_*n23 90 c# c#-6.0 c#-7.0

C#6.0中的新功能允许在TryParse方法中声明变量.我有一些代码:

string s = "Hello";

if (int.TryParse(s, out var result))
{

}
Run Code Online (Sandbox Code Playgroud)

但我收到编译错误: 在此输入图像描述

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

Yuv*_*kov 147

C#6.0中的新功能允许在TryParse方法中声明变量.

声明表达式是从C#6.0中删除的,并未在最终版本中发布.你目前无法做到这一点.在GitHub上为C#7 提出了一个建议(也可以参考这个以供将来参考).

更新(07/03/2017)

随着C#7的正式发布,以下代码编译:

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您的信息!从最终版本中删除它是一个很小的问题,对我来说这是一个很好的功能. (4认同)
  • @ Anton23让我们希望它进入C#7然后:) (2认同)
  • 这对我来说是最期待的功能. (2认同)

Fat*_*gun 12

偶然发现,在vs2017中,你可以这样做以简洁:

if (!Int64.TryParse(id, out _)) {
   // error or whatever...
}
Run Code Online (Sandbox Code Playgroud)

  • 那是丢弃运营商. (2认同)

Pat*_*man 9

这是C#7的一个新功能,这是一个非常好的功能,通常与模式匹配一​​起使用.此功能以及更多内容将在C#团队博客中宣布C#7.0中的新功能.

团队试图在这里实现的是更流畅的代码.你还记得一些情况,其中变量列表变得非常长而没有用吗?只是一个简单的例子:

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*/ }
Run Code Online (Sandbox Code Playgroud)

看到问题?把所有那些变量放在那里无所事事是没用的.使用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*/ }
Run Code Online (Sandbox Code Playgroud)

不仅行数最小化,在您不想拥有它们的范围内也没有不必要的变量列表.这可以防止您使用您不打算使用的变量,但现在可以看到该变量.

此功能对于switch语句中的模式匹配也很有用,例如此代码(其行为与上述代码不同!):

switch (o)
{
    case int i: { /*use i*/ break; }
    case Guid g: { /*use g*/ break; }
    case DateTime d: { /*use d*/ break; }
}
Run Code Online (Sandbox Code Playgroud)