为什么 C#7 语法中的 TryParse(清空参数)在编译时会发出警告?

问题描述 投票:0回答:1

在 C#7 中,你可以这样做

            if (int.TryParse("123", out int result)) 
                Console.WriteLine($"Parsed: {result}");

或者 - 如果您不使用结果而只想检查解析是否成功,则丢弃输出值:

           if (int.TryParse("123", out _))
                Console.WriteLine("Syntax OK");                

通常工作正常,但在 Visual Studio 2017 中,第二个示例中,

out
参数为空,会生成警告

警告 AD0001:分析器“Microsoft.CodeAnalysis.CSharp.Diagnostics.SimplifyTypeNames.CSharpSimplifyTypeNamesDiagnosticAnalyzer”引发“System.NullReferenceException”类型的异常,并显示消息“对象引用未设置到对象的实例。”。

我可以验证它是否发生的 Visual Studio 版本是

Visual Studio Enterprise 2017 版本 15.1 (26403.7) 发布
Visual Studio Enterprise 2017 版本 15.2 (26430.4) 发布

这是一个错误,还是官方不支持

int.TryParse("123", out _)
的使用?到目前为止我找不到任何提示。


为了完整起见,以下是显示问题的控制台应用程序的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (int.TryParse("123", out _))
                Console.WriteLine("Syntax OK");
        }
    }
}
c# visual-studio-2017 c#-7.0 syntactic-sugar
1个回答
7
投票

我向开发团队提交了错误请求(请求#19180),他们确认这是一个错误。 您可以在此处 at GitHub dotnet/roslyn 查看完整状态。

Pilchie 16 小时前发表评论
我可以在 15.2 中重现该内容,但不能在 15.3 中重现。转向基于堆栈的编译器,>但是我很确定这是一个骗局。 @jcouv?

jcouv 于 16 小时前发表评论
是的,这是一个副本(#17229,也可能是另一个)。 它已在 dev15.3 (#17544) 中修复,不幸的是我们无法将 >修复拉入 dev15.2。 感谢@Matt11 提交问题,并对错误表示歉意。

它似乎已经修复,并且据我所知,将在下一次更新中提供。但微软并没有公布何时包含它,所以我通过 Visual Studio 2017 中的“发送反馈/报告问题”提交了一个问题。

备注:

  • 问题不仅限于 TryParse。我验证了如果您编写自己的函数也会发生这种情况,即以下示例也显示警告 AD0001:

    static void Main(string[] args)
    {   
            bool myOutDemo(string str, out int result)
            {
                    result = (str??"").Length;
                    return result > 0;
            }
            // discard out parameter
            if (myOutDemo("123", out _)) Console.WriteLine("String not empty"); 
    }
    
  • 我注意到现在有 VS 版本 15.3 预览版可用,其中应该包含 GitHub 评论中提到的修复。查看以下链接:Visual Studio 2017 版本 15.3 预览版。安装后,我再次验证了该问题,并确认它已修复。


感谢所有参与以上讨论的人! (问题评论)

© www.soinside.com 2019 - 2024. All rights reserved.