TryParse没有var参数


93

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

string s = "Hello";

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

}

但是我收到编译错误: 在此处输入图片说明

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

Answers:


152

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

4
非常感谢您提供信息!它从最终版本中删除是很可惜的,对我来说这是一个很好的功能。
Anton23年

2
@ Anton23让我们希望它然后进入C#7 :)
Yuval Itzchakov

2
这是我最期待的功能。
Tuyen Pham 2015年

至少在C#7 / VS2017中。
ssmith

1
从字面上看,您不能再读一句话?答案确实是C#7,它还解释说它是从6.0开始的。人们仍然在使用C#6.0进行开发
Fus Ro Dah '18

15

刚刚偶然发现的,在vs2017中,为简洁起见,您可以这样做:

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

2
那就是丢弃运算符。
Patrick Hofman

9

这是C#7的一项新功能,这是一个非常好的功能,通常与模式匹配结合使用。C#团队博客在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; }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.