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

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

我注意到 Visual Studio 如何处理标有 ObsoleteAttribute 的代码的使用的变化。 .
假设一些代码调用了一个用这个属性标记的方法。
如果属性是这样应用的:

[Obsolete]
void Foo() { ... } 
然后 Visual Studio 将突出显示 Foo 的任何用途带有绿色下划线,它们将作为警告显示在错误列表 Pane 中。
但如果你这样做:
[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似乎也与此无关。

最佳答案

它是 Warning level Build 的设置驱动这种行为的配置。
ObsoleteAttribute在没有消息的情况下应用,结果是 CS0612 警告,
这是 level 1 .

Compiler warning (level 1) CS0612


ObsoleteAttribute带有消息,结果是 CS0618 警告,
这是 level 2 .

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

关于c# - 为什么 Visual Studio 不认为 Obsolete ("message") 是警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65412994/

相关文章:

c# - 如何在 Visual Studio 中调试时查看 ViewBag 内容?

c# - 有什么方法可以在不重载函数的情况下将 MongoDB ObjectId 用作 C# 中的可选参数

c# - 如何在没有 ADO 包装器的情况下在 C# 中使用 SQLite

.net - 如何在运行时在代码中获取NHibernate生成的SQL?

visual-studio - 尝试连接到运行 IISExpress 的本地主机时如何解决 ERR_CONNECTION_REFUSED - 错误 502(无法从 Visual Studio 进行调试)?

c# - 错误 CS0234 命名空间 'Reporting' 中不存在类型或命名空间名称 'Microsoft'(您是否缺少程序集引用?)

c# - 沿 XAML Shapes.Path 获取点

c# - 在单独的项目中使用 EF 核心设置多个项目

.net - 多个后代类型 linq

c# - 将代码中的绑定(bind)设置为 TextBox WPF 上的 Text 属性不起作用