【问题标题】:Why does Visual Studio not consider Obsolete("message") to be a warning?为什么 Visual Studio 不将 Obsolete("message") 视为警告?
【发布时间】:2021-04-01 09:51:17
【问题描述】:

我注意到 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 似乎也与此无关。

【问题讨论】:

  • 您的构建command line、项目文件或代码中的#pragmas 中是否有任何会抑制警告CS0612CS0618 的内容?如果是这样,也许[Obsolete("message")] 的警告被正确地抑制了,而[Obsolete] 的警告确实不能正常工作。
  • @BACON 在我的代码库中只使用了一种编译指示警告,我将用详细信息更新问题,但我看不出它是如何相关的。
  • @BACON 哦,对于命令行...我们有一些构建后事件行来运行 mt.exe。
  • 您的构建 - 警告级别是如何配置的?您的设置在1 上是可重现的,但在4 上是预期/希望的。
  • @pfx 警告级别设置为 1...

标签: c# .net visual-studio visual-studio-2019 deprecation-warning


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多