为什么VisualStudio不认为Obsolete("message")是警告?

c#

我注意到 Visual Studio 在处理标有ObsoleteAttribute.

假设一些代码调用了一个用这个属性标记的方法。

如果属性是这样应用的:

[Obsolete]
void Foo() { ... } 

然后 Visual Studio 将Foo用绿色下划线突出显示 的任何用法,它们将作为警告显示在错误列表窗格中。

但如果你这样做:

[Obsolete("message")]
void Foo() { ... } 

那么 VS 反而几乎会忽略Foo. 没有警告。如果你将鼠标悬停在它上面,你才会看到它被“弃用”。

我对这种差异感到惊讶......我找不到任何参考资料来解释为什么会这样(没有提到它的例子)。

这种行为没有帮助(至少在我的情况下),因为人们实际上忽略了这些情况并使用了已弃用的代码 - 尽管消息的目的是帮助通知他们。我真的很想让他们看到警告。

有没有办法让 VS 以相同的方式处理这两种情况?即,将它们都视为正常警告?

我知道属性构造函数有一个重载,可以强制将其视为错误,但这不是我要问的。

我正在使用 VS 2019,.NET472 项目。


一条评论询问我们是否有任何#pragma行来禁用警告。这是代码中 pragma 的单一用法:

        #pragma warning disable CS0168
        catch (IOException ex)
        #pragma warning restore CS0168

这显然不使用Obsolete,所以我看不出它是如何相关的。而CS0168似乎并没有与此相关的任何。

回答

驱动这种行为Warning level的是Build配置的设置。

如果在ObsoleteAttribute没有消息的情况下应用 ,则会导致CS0612警告,
level 1

编译器警告(级别 1)CS0612

ObsoleteAttribute带有消息,会导致CS0618警告,
level 2

编译器警告(级别 2)CS0618

将您的警告级别设置为1将忽略CS0618,但将其恢复为4,作为默认值,将同时显示为警告。



[Obsolete] // CS0612
public static void DoSomething() { } 

[Obsolete("obsolete with custom message")] // CS0618
public static void DoSomethingElse() { }

static void Main(string[] args)
{
    DoSomething();
    DoSomethingElse();
}


以上是为什么VisualStudio不认为Obsolete("message")是警告?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>