【问题标题】:TryParse with out var paramTryParse 不带 var 参数
【发布时间】: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# c#-6.0 c#-7.0


    【解决方案1】:

    C# 6.0 中的一个新特性允许在 TryParse 中声明变量 方法。

    声明表达式是从 C# 6.0 中删除的,并未在最终版本中提供。你目前不能这样做。 There is a proposal for it on GitHub 用于 C# 7(另请参阅 this 以供将来参考)。

    更新 (07/03/2017)

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

    string s = "42";
    
    if (int.TryParse(s, out var result))
    {
         Console.WriteLine(result);
    }
    

    【讨论】:

    • 非常感谢您的信息!遗憾的是它从最终版本中删除,对我来说这是一个不错的功能。
    • @Anton23 让我们希望它能进入 C# 7 :)
    • 这是我最期待的功能。
    • 至少在 C#7 / VS2017 中。
    • 你不能再读下去,从字面上看,多一句?答案确实说明了 C# 7,还解释说它是从 6.0 中删除的。人们仍在使用 C# 6.0 进行开发
    【解决方案2】:

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

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

    【讨论】:

    • 那是丢弃操作符。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-31
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2014-07-21
      • 1970-01-01
      相关资源
      最近更新 更多