为什么 Visual Studio 不将 Obsolete("message") 视为警告?

Why does Visual Studio not consider Obsolete("message") to be a warning?

我注意到 Visual Studio 如何处理标有 ObsoleteAttribute 的代码的使用。

假设某些代码调用了一个标有此属性的方法。

如果属性是这样应用的:

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

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

但是如果你这样做:

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

然后 VS 几乎会忽略 Foo 的使用。没有警告。如果将鼠标悬停在它上面,您只会看到它已被“弃用”。

我对这种差异感到惊讶...我一直无法找到任何参考资料来解释为什么会这样(example 没有提到它)。

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

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

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

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


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

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

这显然没有使用Obsolete,所以我看不出它有什么关系。 CS0168 似乎也与此无关。

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

在没有消息的情况下应用 ObsoleteAttribute 时,会导致 CS0612 警告,
这是 level 1.

Compiler warning (level 1) CS0612

而带消息的 ObsoleteAttribute 会导致 CS0618 警告,
这是 level 2.

Compiler Warning (level 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();
}