微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 Visual Studio 不认为 Obsolete("message") 是警告?

我注意到 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

编译器警告(级别 1)CS0612

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

编译器警告(级别 2)CS0618

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


enter image description here


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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。