为什么在C#7中使用TryParse语法(空出参数)如果编译它会发出警告?

Mat*_*att 18 c# c#-7.0 visual-studio-2017

在C#7中,你被允许这样做

            if (int.TryParse("123", out int result)) 
                Console.WriteLine($"Parsed: {result}");
Run Code Online (Sandbox Code Playgroud)

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

           if (int.TryParse("123", out _))
                Console.WriteLine("Syntax OK");                
Run Code Online (Sandbox Code Playgroud)

这通常很好,但在Visual Studio 2017中,out参数为空的第二个示例生成警告

警告AD0001:Analyzer'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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 6

我向开发团队提交了一个错误请求(请求#19180),他们确认这是一个错误.你可以在GitHub dotnet/roslyn看到整个状态.

Pilchie在16小时前发表评论
我可以在15.2中重复,但不是15.3.转移到基于堆栈的编译器,> Abut我很确定这是一个骗局.@jcouv?

jcouv在16小时前评论
是的,这是重复的(#17229,也可能是另一个).它已在dev15.3(#17544)中修复,遗憾的是我们无法将> fix修改为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"); 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 我注意到现在有一​​个VS Version 15.3预览版,它应该包含GitHub评论中提到的修复程序.请查看以下链接:Visual Studio 2017版本15.3预览.安装后,我再次验证了问题并确认它已在那里修复.


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