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

特长

我注意到Visual Studio处理使用标记为的代码的方式有所不同ObsoleteAttribute

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

如果属性是这样应用的:

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

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

但是,如果您这样做:

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

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

这种差异让我感到惊讶……我找不到任何解释其原因的参考文献(示例未提及)。

这种行为无济于事(至少在我的情况下),因为人们实际上忽略了这些情况并使用了已弃用的代码-尽管消息的重点是帮助告知他们。我真的很希望他们看到警告。

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

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

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


一条评论询问我们是否有任何#pragma行可以禁用警告。这是在代码中对编译指示的单一使用:

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

这显然不使用Obsolete,因此我不知道它如何关联。CS0168似乎并没有与此相关的任何。

x

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么不将静态方法视为良好的OO实践?

为什么不将此类视为超类型作为参数?

Go编译器为什么不将未声明的变量视为错误?

为什么Visual Studio不警告静态字符串的循环初始化?

会话特定于什么?为什么不将IP和域名会话视为相同?

为什么预处理不将回车符视为空白字符

C优化:为什么编译器不将对象视为常量?

为什么在C中不将函数视为一等公民

为什么有时在类模板中不将Injection-class-name视为模板名称?

当我们在C ++中声明头文件时,为什么不将空格视为空白?

为什么Android Studio不给newapi警告?

为什么需要Visual Studio安装nuget?

为什么类函数不将向量视为R中的向量?

为什么不将路径除以默认构造路径,而只是在Visual Studio中添加尾随分隔符?

Travis for React如何不将警告视为错误

为什么Visual Studio不警告我有关空引用异常的信息?

将KeyValuePair枚举传递到FormUrlEncodedContent构造函数时,Visual Studio为什么会生成警告CS620?

Visual Studio 2019 Publish将警告视为错误

C中函数返回的隐式强制转换以及Visual Studio为什么不引发警告

有没有办法告诉Visual Studio将警告视为警告而不是错误?

为什么此代码为什么在Visual Studio 2012上的代码分析中发出缓冲区溢出警告(C6385 / C6386)?

为什么Visual Studio不了解“线程”?

为什么禁用特定警告在Visual Studio中不起作用

为什么Visual Studio 2013架构比较包含每个对象定义的权限声明,并将其与项目视为不同?

为什么React.PropTypes.node验证不将React渲染的DOM节点视为节点?

Visual Studio 2019 调试嵌入式目标。如何强制 VS 不将其视为 Windows 可执行文件

为什么我在 Visual Studio 中收到此警告 C26495?

For 循环不起作用(并且 Visual Studio 会发出警告),为什么?

谁能让我理解为什么 Visual Studio 会针对我的 C++ 代码给我这个警告?