【发布时间】:2015-10-21 20:00:39
【问题描述】:
C# 6.0 中的一项新功能允许在 TryParse 方法中声明变量。 我有一些代码:
string s = "Hello";
if (int.TryParse(s, out var result))
{
}
我做错了什么? P.S.:在项目设置中设置了 C# 6.0 和 .NET framework 4.6。
【问题讨论】:
C# 6.0 中的一项新功能允许在 TryParse 方法中声明变量。 我有一些代码:
string s = "Hello";
if (int.TryParse(s, out var result))
{
}
我做错了什么? P.S.:在项目设置中设置了 C# 6.0 和 .NET framework 4.6。
【问题讨论】:
C# 6.0 中的一个新特性允许在 TryParse 中声明变量 方法。
声明表达式是从 C# 6.0 中删除的,并未在最终版本中提供。你目前不能这样做。 There is a proposal for it on GitHub 用于 C# 7(另请参阅 this 以供将来参考)。
随着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# 团队博客What’s New in 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*/ }
看到问题了吗?让所有这些输出变量坐在那里什么都不做是没有用的。使用 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; }
}
【讨论】: