Answers:
C#6.0中的一项新功能允许在TryParse方法中声明变量。
声明表达式从C#6.0中删除,并且在最终版本中未提供。您目前无法执行此操作。在GitHub上有一个针对C#7的建议(另请参阅此以供将来参考)。
在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的一项新功能,这是一个非常好的功能,通常与模式匹配结合使用。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; }
}