为什么 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();
}
我注意到 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();
}