【问题标题】:How to ignore compiler warning when using Obsolete attribute on a class used with a KnownType attribute在与 KnownType 属性一起使用的类上使用 Obsolete 属性时如何忽略编译器警告
【发布时间】:2011-03-11 15:46:19
【问题描述】:

因此,我们正在尝试弃用一些现有的类,并开始使用 ObsoleteAttribute 将它们标记为已过时,以便停止使用它们。预期将 KnownType 属性与标记为 Obsolete 属性的类型一起使用并导致编译器警告的事实。但是,在我们的项目中,我们将警告视为错误,因此不能选择忽略警告。是否有一个编译器指令来抑制这个警告?

以下用法会导致编译器警告:

///ProductTemplateDataSet is marked with the Obsolete attribute
[KnownType(typeof(ProductTemplateDataSet))]
public class EntityCollectionBase : System.Data.DataSet
{
}

编辑:我理解使用编译器指令来忽略错误,但是这个编译器警告没有数字。

【问题讨论】:

标签: c# .net attributes compiler-warnings


【解决方案1】:

使用它来禁用违规行之前的相应警告:

#pragma warning disable 612, 618

然后重新启用警告:

#pragma warning restore 612, 618

奇怪的是,有 2 个与此相关的警告:CS0612CS0618 - 一个用于 [Obsolete],另一个用于 [Obsolete("Message")]。去图...

【讨论】:

  • 如果您不想在代码中添加#pragmas,可以在下面查看我的回答。
【解决方案2】:

如果您想避免在代码中添加#prgramas,请尝试以下操作:
在您的 csproj 文件中,找到适当的 PropertyGroup 元素并添加

<WarningsNotAsErrors>612,618</WarningsNotAsErrors>

这是我的一个项目文件中的一个 sn-p:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>TRACE;DEBUG</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <WarningsNotAsErrors>612,618</WarningsNotAsErrors>
    <NoWarn>
    </NoWarn>
    <WarningsAsErrors>
    </WarningsAsErrors>
</PropertyGroup>

我已经成功地将它用于 VS2010、VS2012 和 VS2013 项目。

【讨论】:

  • 其实,&lt;NoWarn /&gt; 块就是你想放的地方。在 &lt;WarningsNotAsErrors /&gt; 块中指定此信息只会将错误降级为常规警告(您已将 &lt;TreatWarningsAsErrors /&gt; 设置为 true)。
  • 我不认为隐藏警告是 OP 的意图。毕竟,他们是故意将Obsolete 属性添加到自己的代码中。问题是他们还启用了将警告视为错误,这会阻止他们构建项目。我提出的解决方案允许他们保留Obsolete 警告构建他们的项目。
  • 另外将这些警告添加到项目设置(项目 -> 属性 -> 构建)中的“抑制警告”框中,以将它们从警告列表中隐藏
  • @vladimir77,再次强调,重点不是抑制警告。这是为了将它们保留为警告,同时将所有其他警告视为错误。
  • 不确定为什么这不是“最佳”答案。警告(特别是对于可能在某个时候从 ABI 中消失的过时的警告)通常应该一直保留到解决;编译失败不应该。
【解决方案3】:

您可以使用#pragma 列出适当的警告编号吗?

#pragma warning (C# Reference)

编辑

找到了,但有点晚了C# - Selectively suppress custom Obsolete warnings

【讨论】:

  • 对,但是什么警告号?它并没有从编译器输出中说出来。
  • 你可以对它进行核化; "当没有指定警告编号时,disable 禁用所有警告,restore 启用所有警告。"
  • “警告为错误:'classblah' 已过时 'D:\Development\blah.cs'”第 14 行和第 12 列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 2011-03-19
  • 2017-06-01
  • 2023-04-04
相关资源
最近更新 更多