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

2024-01-31

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

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

或者 - 如果您不使用结果而只想检查解析是否成功,discard https://learn.microsoft.com/en-us/dotnet/csharp/discards输出值:

           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)给开发团队,他们确认这是一个错误。 您可以在此处查看完整状态位于 GitHub dotnet/roslyn。 https://github.com/dotnet/roslyn/issues/19180

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

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

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

Notes:

  • 该问题不仅限于 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 预览版 https://www.visualstudio.com/vs/preview/。安装后,我再次验证了该问题并确认它已修复。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 查找并发、重叠、日期范围的数量

    我有一个多年来一直试图解决的难题 但它完全超出了我的能力范围 我有一个包含 3 列的电子表格 A 列是讲师 ID 号 B 列是他们的课程开始日期 C 列是他们的课程结束日期 每个讲师 ID 都有多个课程 我基本上是想回答这个问题 这位讲师在
  • 独立于平台的资源系统(如 Qt Resource 系统)

    是否有一个类似于 Qt 附带的 C 平台独立资源系统 但没有 Qt 依赖项 我想从我的 C 源代码中访问任意数据 也就是说 不仅是图标 还包括翻译或着色器等 或者某种虚拟文件系统库来访问 例如ZIP 压缩文件或类似文件也能满足我的需要 我为
  • 检查视口中的可见性(puppeteer)

    如何使用 Puppeteer 检查 HTML 元素在视口 可见区域 内是否可见 例如 如果我必须滚动才能看到一个按钮 那么它就不可见 page waitForSelector element visible true page waitFo
  • 正则表达式前瞻、后瞻和原子组

    我在我的正则表达式体内发现了这些东西 但我不知道我可以用它们做什么 有人有例子 以便我可以尝试理解它们是如何工作的吗 positive lookahead negative lookahead lt positive lookbehind
  • 使用 Python Rich 在布局内获取提示

    是否可以使用提示获取用户输入within使用 Python Rich 的布局元素 我的目标是使用 Rich 的 Layout 构建一个具有 4 个窗格的全屏窗口 顶部 3 个包含标题 成分和方法 效果很好 但我希望底部一个包含用户输入的提示
  • Xamarin.Forms 中的透明页面

    我需要能够为 Android 创建透明的 Xamarin Forms 页面 我怎样才能做到这一点真正的页面渲染器 现在它有默认的背景颜色 assembly ExportRenderer typeof MyPage typeof ClearB
  • 如何在 Web 应用程序中使用 java.util.logger?

    我正在尝试在网络应用程序中使用记录器 我添加了 FileHandler 将日志写入文件 现在 我需要在项目中的其他类 servlet 中使用相同的处理程序 以便将所有类的日志写入同一文本文件 我怎样才能实现这个目标 Initialize a
  • VBA 动态范围

    我想知道是否有人可以帮助我 我将下面的代码放在一起 在我的工作簿中创建一个新工作表并应用动态命名范围和页面格式 Sub AllDataNamedRanges Dim rLOB As Range Dim rStaffName As Range
  • keras:如何保存历史对象的训练历史属性

    在 Keras 中 我们可以返回以下输出model fit历史记录如下 history model fit X train y train batch size batch size nb epoch nb epoch validation
  • C++20 前后 std::atomic 的初始化

    考虑以下两行代码 std atomic flag a Since C 20 std atomic flag a ATOMIC FLAG INIT Until C 20 在C 20中 第一行初始化a到清晰的状态 但如果我在 C 17 中使用它
  • 已弃用 - Laravel:如何使用 Carbon 在视图中本地化日期[重复]

    这个问题在这里已经有答案了 我正在尝试本地化Carbon不同语言的视图中的日期到目前为止还没有成功 我从模型中检索日期并将其发送到视图 Route get tables setup function now Date now Europe
  • Phonegap 3.0 自定义插件

    几个月前 我用phonegap 2 7为一个应用程序编写了一个插件 它运行得很好 该插件基本上打开用户电话簿并将用户选择的联系人的详细信息返回到我的应用程序 我最近升级到 Phonegap 3 0 我正在尝试将我的插件转换为 3 0 但是我
  • 如何将 NSData 值转换为 UIImage [重复]

    这个问题在这里已经有答案了 可能的重复 NSData 到 UIImage https stackoverflow com questions 2240765 nsdata to uiimage 如何将 NSData 值转换为 UIImage
  • Python 中二维矩阵的单元格分配,无需 numpy

    下面是我的脚本 它基本上创建了一个 12x8 的零矩阵 其中填充了 0 然后我想将其一一填充 假设第 2 列第 0 行需要为 5 我该怎么做 下面的示例显示了我是如何做到的以及错误的 根据我的需要 输出 list MatrixRow lis
  • 为什么要禁用垃圾收集器?

    Pythons gc disable http docs python org 3 3 library gc html gc disable禁用自动垃圾收集 据我了解 这会产生相当多的副作用 为什么有人想要禁用自动垃圾收集 如果没有它 如何
  • Swift 4 中的访问控制

    升级到Swift4 from Swift3 我遇到了一些相关问题access control 这是示例代码 其中有Swift3 过去工作正常 open class MyClass private let value Int static v
  • Xcode 机器人在成功/失败时不发送电子邮件

    我设置了 Xcode Bots 它运行成功 但是 尽管设置了电子邮件地址以在构建成功或失败时收到通知 但我没有收到任何电子邮件 是否有任何额外的 SMTP 设置需要隐藏在某处 您可能需要配置 Mac OSX 服务器来发送电子邮件 本地服务器
  • 如何在 Eclipse 中根据变量设置 Ant 属性?

    我有一个常见问题 可能有无数种方法可以解决它 我正在为这种典型场景寻找一种优雅 简单的解决方案 我在 Eclipse 中有一个带有 Ant 构建文件 build xml 的项目 该构建文件使用属性文件 build properties 在该
  • NSRegularExpression 用于剥离 HTML 标签

    我正在开发一个电子书阅读器应用程序 我有整本电子书的 ePUB 文件 其中电子书的每个主题都是一个 html 文件 我想在应用程序中实现搜索功能 我正在使用 NSRegularExpression 类进行搜索 请考虑以下 html 代码
  • 为什么 C#7 语法中的 TryParse(清空参数)在编译时会发出警告?

    在 C 7 中 你可以这样做 if int TryParse 123 out int result Console WriteLine Parsed result 或者 如果您不使用结果而只想检查解析是否成功 discard https l