禁止显示编译器警告

使用 Visual Studio,可以通过在项目设计器(项目属性页)中指定警告代码来指定要取消的警告。 还可以通过在项目文件、命令行或代码中直接设置某些属性来禁止显示警告,前提是你想要仅在一个位置禁止显示警告。

某些编译器和生成工具还具有指定警告级别的选项。 这样,便可以使用一个设置控制警告类别。 有关这些选项,请参阅所使用的特定语言和编译器的文档:

如果目标是在生成日志中看到更简洁且更集中的输出,则可能需要更改生成日志的详细程度。 可以选择的设置包括:普通详细诊断。 有关冗长程度的更多信息,请参阅 如何:查看、保存和配置生成日志文件

谨慎

请注意,警告旨在表明代码存在潜在问题,因此应了解禁用任何特定警告的风险。 Visual Studio 设置在项目级别禁用警告。 你可能想要使用比 Visual Studio 提供的更有针对性的方法来禁用警告。 大多数编译器提供了仅针对特定代码行禁用警告的方法,因此,如果警告发生在同一项目中的其他地方,仍可查看这些警告。

取消显示特定的 Visual C# 或 F# 警告

使用生成属性可禁止显示整个 C# 和 F# 项目的特定警告。 如果只想在 C# 中的代码的特定部分中禁止显示警告,请使用 #pragma 警告。 对于 F#,请使用 #nowarn 预处理器指令来禁用整个源文件的警告。

  1. 解决方案资源管理器中,选择要在其中取消警告的项目。

  2. 右键单击项目节点,然后在上下文菜单中选择 属性。 或者,选择项目节点,然后按 Alt+Enter

  3. 选择 生成,然后转到 错误和警告 小节。

  4. 在“禁止显示警告禁止显示特定警告 框中,指定要取消的警告的错误代码,用分号分隔。 有关警告代码的列表和说明,请参阅 C# 编译器消息

  5. 重新生成解决方案。

  1. 解决方案资源管理器中,选择要在其中取消警告的项目。

  2. 右键单击项目节点,然后在上下文菜单中选择 属性。 或者,选择项目节点,然后按 Alt+Enter

  3. 选择“生成”页面或部分,如果位于当前 UI 中,请打开“错误和警告”小节

  4. 在“禁止显示警告禁止显示特定警告 框中,指定要取消的警告的错误代码,用分号分隔。 有关警告代码的列表和说明,请参阅 C# 编译器消息

  5. 重新生成解决方案。

说明

无法禁止显示某些警告。 有关这些列表,请参阅 NoWarn 编译器选项

禁止显示C++的特定警告

可以使用项目属性取消C++项目中的警告;可以使用 配置属性 属性页来禁止显示整个C++项目的特定警告。 还可以使用 #pragma warning取消特定文件中的警告。 本文介绍项目级控件,但是如果你的意图是禁用特定文件中的警告或只是几行代码,但你想要继续看到同一警告的其他事件,则应考虑使用 #pragma warning。 请参阅 #pragma 警告

  1. 解决方案资源管理器中,选择要禁止显示警告的项目或源文件。

  2. 在菜单栏上,依次选择“查看”>“属性页”

  3. 选择 配置属性 类别,选择 C/C++ 类别,然后选择 高级 页。

  4. 执行以下步骤之一:

    • 在“禁用特定警告” 框中,指定要禁止的警告的错误代码,用分号分隔。

    • 禁用特定警告 框中,选择 “编辑”以显示更多选项。

  5. 选择 “确定” 按钮,然后重新生成解决方案。

如果警告来自另一个工具,请参阅特定工具的文档,了解如何禁止显示该工具的警告。 例如,C++ 链接器具有一些可以使用 /IGNORE 链接器选项禁用的警告。 请参阅 /IGNORE (忽略特定警告),若要设置此选项,请参阅 /link (将选项传递给链接器)

禁止显示 Visual Basic 的警告

可以通过编辑项目的 .vbproj 文件来隐藏 Visual Basic 的特定编译器警告。 若要抑制 类别的警告,可以使用 编译属性页。 如果要在代码文件的特定部分中禁用警告,请使用 #Disable 和 #Enable 指令。 有关详细信息,请参阅 在 Visual Basic中配置警告。

禁止显示整个 Visual Basic 项目的特定警告

此示例演示如何编辑 .vbproj 文件以禁止显示特定的编译器警告。

  1. 解决方案资源管理器中,选择要在其中取消警告的项目。

  2. 在菜单栏上,选择“项目”>“卸载项目”

  3. 解决方案资源管理器中,打开项目的右键菜单或快捷菜单,然后选择 编辑 <ProjectName>.vbproj

    XML 项目文件将在代码编辑器中打开。

  4. 找到正在生成的用于生成配置的 <NoWarn> 元素,并添加一个或多个警告编号作为 <NoWarn> 元素的值。 如果指定多个警告编号,请用逗号分隔它们。

    以下示例显示了 x86 平台上的“调试”生成配置的 <NoWarn> 元素,其中取消显示了两个编译器警告:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
        <PlatformTarget>x86</PlatformTarget>
        <DebugSymbols>true</DebugSymbols>
        <DebugType>full</DebugType>
        <Optimize>false</Optimize>
        <OutputPath>bin\Debug\</OutputPath>
        <DefineDebug>true</DefineDebug>
        <DefineTrace>true</DefineTrace>
        <ErrorReport>prompt</ErrorReport>
        <NoWarn>40059,42024</NoWarn>
        <WarningLevel>1</WarningLevel>
      </PropertyGroup>
    

    说明

    默认情况下,.NET Core 项目不包含生成配置属性组。 若要取消 .NET Core 项目中的警告,请手动将生成配置部分添加到文件。 例如:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.0</TargetFramework>
        <RootNamespace>VBDotNetCore_1</RootNamespace>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <NoWarn>42016,41999,42017</NoWarn>
      </PropertyGroup>
    </Project>
    
  5. 保存对 .vbproj 文件的更改。

  6. 在菜单栏上,选择 Project>重载项目

  7. 在菜单栏上,选择“生成”>“重新生成解决方案”

    “输出”窗口不再显示指定的警告。

有关详细信息,请参阅 Visual Basic 命令行编译器的 /nowarn 编译器选项

可以屏蔽单个警告,也可以按类别屏蔽警告。 体验因使用的是 .NET Framework 项目还是 .NET Core(或 .NET 5 及更高版本)项目而异。

如果要在代码文件的特定部分中禁用警告,请使用 #Disable 和 #Enable 指令。 有关详细信息,请参阅 在 Visual Basic中配置警告。

.NET 5 或更高版本的项目

可以编辑项目文件以按诊断代码取消特定编译器警告,也可以使用项目设计器按类别取消警告。 若要打开项目设计器,请选择项目节点,右键单击并选择 属性,或按 Alt Alt+Enter

在“编译”部分中,选择“警告”。 在 警告严重性下,您可以选择 单独设置警告严重性。 类别将被显示,您可以选择将每个类别设置为 “无” 来禁用该类别,或将其设置为 “警告”“错误” 来启用它为警告或错误。

显示 Visual Basic .NET 项目的警告严重性设置的屏幕截图。

.NET Framework 项目

可以通过编辑项目的 .vbproj 文件来隐藏 Visual Basic 的特定编译器警告。 若要按“类别”取消显示警告,可以使用编译属性页

禁止显示整个 Visual Basic 项目的特定警告

此示例演示如何编辑 .vbproj 文件以禁止显示特定的编译器警告。

  1. 解决方案资源管理器中,选择要在其中取消警告的项目。

  2. (.NET)双击项目节点以打开项目文件。

    (.NET Framework) 在菜单栏上,选择“项目”>“卸载项目”。 然后在“解决方案资源管理器”中,打开项目的右键单击菜单或快捷菜单,然后选择“编辑 <ProjectName>.vbproj”

    MSBuild 项目文件将在代码编辑器中打开。 这是一个 XML 文件。

  3. 找到您正在使用的构建配置的 <NoWarn> 元素,并将一个或多个警告编号作为 <NoWarn> 元素的值添加进去。 如果指定多个警告编号,请用逗号分隔它们。

    以下示例显示了 x86 平台上的“调试”生成配置的 <NoWarn> 元素,其中取消显示了两个编译器警告:

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
        <PlatformTarget>x86</PlatformTarget>
        <DebugSymbols>true</DebugSymbols>
        <DebugType>full</DebugType>
        <Optimize>false</Optimize>
        <OutputPath>bin\Debug\</OutputPath>
        <DefineDebug>true</DefineDebug>
        <DefineTrace>true</DefineTrace>
        <ErrorReport>prompt</ErrorReport>
        <NoWarn>40059,42024</NoWarn>
        <WarningLevel>1</WarningLevel>
      </PropertyGroup>
    

    说明

    默认情况下,.NET Core 和 .NET 5 及更高版本项目不包含生成配置属性组。 若要取消 .NET Core 项目中的警告,请手动将生成配置部分添加到文件。 例如:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.0</TargetFramework>
        <RootNamespace>VBDotNetCore_1</RootNamespace>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
        <NoWarn>42016,41999,42017</NoWarn>
      </PropertyGroup>
    </Project>
    
  4. 保存对 .vbproj 文件的更改。

  5. 在菜单栏上,选择 Project>重载项目

  6. 在菜单栏上,选择“生成”>“重新生成解决方案”

    “输出”窗口不再显示指定的警告。

有关详细信息,请参阅 Visual Basic 命令行编译器的 /nowarn 编译器选项

通过编辑项目文件取消警告

使用 Visual Studio 属性设计器取消警告会导致更改项目文件。 有时,手动编辑项目文件来完成禁用警告的任务可能更方便。 项目文件由 MSBuild 处理,Microsoft的生成引擎。 请参阅 MSBuild

此外,在 Visual Studio 2019 版本 16.7 及更早版本中,编译器以外的工具的某些警告不能以任何其他方式禁止显示。

  1. 若要在 Visual Studio 编辑器中打开项目文件,请右键单击项目节点,然后选择 编辑项目文件。 某些项目类型要求先卸载项目,然后才能编辑项目文件。 如果需要卸载项目,请右键单击项目节点并选择 卸载项目

  2. 在新的 PropertyGroup 部分中,使用 NoWarn 属性。 列出要取消的错误,用逗号或分号分隔。 对于编译器警告,可以省略语言代码并仅输入数字,但为了清楚起见,我们建议使用完整的代码。 对于构建中来自其他工具的警告,请指定完整的代码,包括前缀(如 MSB 用于 MSBuild 本身发出的警告)。

    以下代码将警告 CS0028 和 CS0618 添加到禁止显示的警告列表中:

    <PropertyGroup>
       // Other properties
       <NoWarn>$(NoWarn);CS0028;CS0618</NoWarn>
    </PropertyGroup>
    

    引用上一示例中所示的上一个 $(NoWarn) 值,将这些数字添加到以前为 NoWarn 设置的值,而不是覆盖它。

请参阅 NoWarn

禁止显示生成命令行中的警告

如果要从命令行生成项目,还可以通过在 MSBuild 命令行中使用 -warnAsMessage 来禁止显示警告。 对多个警告代码列表使用引号。

MSBuild.exe -warnAsMessage="CS0028;CS0618" MyProject.csproj

请参阅 MSBuild 命令行参考

禁止显示目录结构中所有项目和解决方案的警告

如果它们都位于文件系统的一个公共目录下,可以使用 MSBuild 文件 Directory.Build.props来抑制许多项目的警告。 请参阅按目录自定义生成。 例如,如果将以下 Directory.Build.props 文件放在包含多个解决方案和项目的文件夹根目录中,则可以针对该文件夹中的所有项目以及以递归方式包含在其中的文件夹中的所有项目禁止显示指定警告列表

<Project>
   <PropertyGroup>
      <NoWarn>$(NoWarn);CS0028;CS0618</NoWarn>
   </PropertyGroup>
</Project>

禁止显示工具警告

禁止来自编译器以外的工具(如 MSBuild)的警告的方式取决于你拥有的项目类型以及所使用的 MSBuild 版本。

使用 MSBuild 16.8 及更高版本,在使用 SDK 或标准导入的项目中,可以使用前面所述的相同方法禁止显示工具警告。 必须指定完整的错误代码(包括 MSBuild 的前缀,比如 MSB),而不能像编译器警告那样只使用一个数字。 此外,消息不会消除;它仍显示为信息性消息,但已从警告中降级。

使用 MSBuild 16.7 及更低版本,并且在任何不使用 SDK 或标准导入的项目中,不会使用 NoWarn 禁止显示这些警告。 在这种情况下,您可以使用属性 MSBuildWarningsAsMessages来禁止工具警告的显示。 可以通过编辑项目文件或在 MSBuild 命令行中指定 MSBuildWarningsAsMessages 选项来禁止生成警告。 使用 MSBuildWarningsAsMessages时,请使用完整的 MSBuild 错误代码,包括 MSB 前缀。

<PropertyGroup>
    <MSBuildWarningsAsMessages>$(MSBuildWarningsAsMessages);MSB3270</MSBuildWarningsAsMessages>
</PropertyGroup>

请注意,无法通过设置 MSBuildWarningsAsMessages来禁止显示某些 MSBuild 警告。 若要禁用它们,请使用命令行选项 warnAsMessage

此外,某些警告具有可设置为禁用警告的特定属性。 例如,通过设置属性禁用 MSB3253

 <PropertyGroup>
    <ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
        None
    </ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
  </PropertyGroup>

如果可能,请使用更明确的属性,因为错误代码本身并不容易理解。 代码的错误引用页通常包含用于禁用它的属性。

取消显示 NuGet 包警告

在某些情况下,你可能希望禁止显示单个 NuGet 包的 NuGet 编译器警告(而不是整个项目)。 该警告具有特定的作用,因此你不希望在项目级别禁止显示它。 例如,NuGet 警告之一提示包可能无法与项目完全兼容。 如果在项目级别取消它,稍后再添加一个 NuGet 包,则永远不知道它是否正在生成兼容性警告。

取消显示单个 NuGet 包的特定警告

  1. 解决方案资源管理器中,选择要禁止显示编译器警告的 NuGet 包。

    解决方案资源管理器中 NuGet 包的屏幕截图。

    解决方案资源管理器中 NuGet 包的屏幕截图。

  2. 在右键单击菜单或上下文菜单中,选择“属性”

  3. 在包属性的“禁止显示警告” 框中,输入要为此包禁止显示的警告号。 如果要取消多个警告,请使用逗号分隔警告编号。

    NuGet 包属性

    NuGet 包属性的屏幕截图

    警告从解决方案资源管理器 错误列表中消失。 在项目文件中,设置了 NoWarn 属性。

     <PackageReference Include="NuGet.Build.Tasks.Pack" Version="6.2.0">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
       <NoWarn>NU5104</NoWarn>
     </PackageReference>
    

禁止显示代码分析警告

CA 开头的代码的诊断消息是代码分析冲突和警告,这与本文中讨论的编译器警告不同。 可以使用规则配置文件以各种方式禁止显示代码分析警告,包括使用特定于站点的标记和项目范围或全局。 请参阅禁止显示 Code Analysis 警告禁止显示 Code Analysis 违规