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)
我向开发团队提交了一个错误请求(请求#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预览.安装后,我再次验证了问题并确认它已在那里修复.
感谢所有参与上述讨论的人!(问题评论)
归档时间: |
|
查看次数: |
1201 次 |
最近记录: |