在 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");
}
}
}
我向开发团队提交了错误请求(请求#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 预览版。安装后,我再次验证了该问题,并确认它已修复。
感谢所有参与以上讨论的人! (问题评论)