如何在使用KnownType属性的类中使用Obsolete属性并忽略编译器警告?

62

我们正在试图废弃一些现有的类,并开始使用ObsoleteAttribute将它们标记为过时,以停止使用。使用KnownType属性与标记为过时属性的类型,会导致编译器警告,这是可以预料的。但是,在我们的项目中,警告被视为错误,所以忽略警告不是一个选项。有没有编译器指令来抑制这个警告?

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

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

编辑:我知道使用编译器指令来忽略错误,但是这个编译器警告没有编号。


可能是C# - Selectively suppress custom Obsolete warnings的重复问题。 - Kira
3个回答

124

在问题所在的代码行之前使用此方法以禁用相应的警告:

#pragma warning disable 612, 618

然后在此之后重新启用警告:

#pragma warning restore 612, 618

有趣的是,与此相关的有两个警告:CS0612CS0618 - 其中一个是用于[Obsolete],另一个是用于[Obsolete("Message")]。你自己想吧...


4
如果您不想在代码中添加#pragma,可以查看我下面的答案。 - MetaFight

69

如果你想避免在代码中频繁使用#programa,可以尝试以下方法:
在你的csproj文件中,找到相应的PropertyGroup元素并添加

<WarningsNotAsErrors>612,618</WarningsNotAsErrors>

这是我一个项目文件中的代码片段:

<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 项目中成功使用了这个。


4
实际上,<NoWarn /> 块是你想放置它的地方。在 <WarningsNotAsErrors /> 块中指定此信息只会将错误降级为普通警告(因为你已经将 <TreatWarningsAsErrors /> 设置为 true)。 - BrainSlugs83
9
我认为隐藏警告不是OP的意图。毕竟,他们是故意向自己的代码添加“过时”属性的。问题在于,他们还启用了“将警告视为错误”,这会阻止他们构建项目。我提出的解决方案允许他们保留“过时”警告并构建项目。 - MetaFight
1
另外,在项目设置中的“抑制警告”框中添加以下警告,以将它们从警告列表中隐藏起来(项目 -> 属性 -> 构建)。 - vladimir
4
@vladimir77,重点不是要压制警告。而是将它们保留为警告,同时将所有其他警告视为错误。 - MetaFight
不确定为什么这不是“正确”的答案。警告(特别是过时的警告,可能在某些时候从ABI中消失)通常应保留直到解决;编译失败则不应该。 - user2864740
@MetaFight 如果我们不想使用<WarningNotAsErrors>块,有没有其他解决方法? - NetSurfer

5

没错,但是是哪个警告号?编译器输出中没有说明。 - Jace Rhea
你可以对它使用核武器;“当没有指定警告编号时,禁用将禁用所有警告并启用将启用所有警告。” - MattC
警告作为错误:'classblah'已过时 'D:\Development\blah.cs',行号14,列号12。 - Jace Rhea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接