取消编译器警告

使用 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. 在菜单栏上,依次选择“项目”>“重载项目”。

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

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

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

通过编辑项目文件禁止显示警告

使用 Visual Studio 属性设计器禁止显示警告会导致项目文件发生变化。 有时,手动编辑项目文件来完成禁用警告的操作可能更方便。 项目文件由 Microsoft 的编译引擎 MSBuild 处理。 请参阅 MSBuild

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

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

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

    以下代码将警告 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)以外的工具的警告的方式取决于拥有的项目类型以及所使用的 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 包。

    Screenshot of NuGet package in Solution Explorer.

    Screenshot of NuGet package in Solution Explorer.

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

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

    NuGet package properties

    Screenshot of NuGet package properties

    警告已从解决方案资源管理器和错误列表消失。 在项目文件中,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>