How do I cause the use of obsolete methods to fail compilation
我想将一个方法标记为过时的,如果从任何地方调用它,也会导致编译失败。
我在这里遇到了一个解决方案,如何将方法标记为已过时/已弃用?.
一个答案建议使用这种语法,说布尔修饰符将达到我想要的效果(编译失败)
1
| [Obsolete("Method1 is deprecated, please use Method2 instead.", true)] |
然而,虽然这在同一个项目中有效,但在从另一个项目调用方法时却没有(我甚至让Visual Studio生产力增强工具为它显示了一个eror,但编译仍然成功)
这是设计的吗?或者有解决方法吗?
- 读这个so线程。只需打开"将警告视为错误"。
- 如果您希望引用此方法的代码不编译,为什么首先要编译它?从API中删除它。[EDOCX1[0]属性用于阻止(而不是禁止)用户使用此方法,同时保持向后兼容性。如果这不是你想要的,那么Obsolete不是你需要的。
- 使用过时的方法将生成警告。对于这些特定的警告,可以将警告作为项目中的错误打开。
- @你应该把它作为答案
- 你确定要重建另一个项目吗?在构建引用该方法的新项目时,[Obsolete]应发出警告,但已构建并引用该方法的现有项目不应受到影响。
- @Theodoros Chatzigiannakis在同一个解决方案中有两个项目,我正在通过添加和删除布尔值进行修补,但这并没有阻止编译。
- @dcastro我不确定微软开发人员是否同意你的观点,因为真正的布尔值就是这样(禁止使用),我的问题是它在项目之间不起作用。为什么要把它放在第一位?"问题是我知道代码是过时的,我不会使用它,但是在两年内,另一个开发人员可能会尝试使用它,并且不会注意到一个简单的警告。
- 为什么不把它改成1号(3号)并做标记呢?
- 主要问题可能是这种行为是通过设计还是可能的错误
- @你的要求绝对正确。[Obsolete("", true)]应该抛出一个编译器错误,即使是跨项目的。这就是文档所说的,这就是我现在在系统上看到的行为。我可以建议您在项目中搜索抑制错误的任何指令吗?
- @sszarek这并不能解决我的问题,因为语法已经产生了一个错误,但在我的例子中,它只用于来自同一个项目的引用。
- @souhaiebbesbes同样,您是否将一个项目作为外部程序集引用到另一个项目,或者作为解决方案中的项目引用?如果您已经完成了前者,那么出于某种原因,可能会意外地引用其他项目的过期版本。也可以试试后者。
- @Theodoros Chatzigiannakis这是一个项目参考,所以这里没有过时的问题。
- @如果你用两个新项目建立了一个新的解决方案,你能复制这个问题吗?它是否仍然忽略属性,或者在这种情况下抛出错误?
- @西奥多罗·查齐亚纳基斯在一个新的解决方案中,这个很好,所以我放弃了
如果在同样被标记为已过时的方法或类中使用标记为已过时的内容,编译器将不会向您发出警告或错误。
在某些类中考虑以下过时的方法:
1 2 3 4 5
| public class SomeClass
{
[Obsolete("Don't use",true)]
public static void ObsoleteMethod() { }
} |
预期的行为是每当使用编译器时都会产生一个错误。
但是,如果在另一个过时的方法中使用它,甚至不会收到编译器警告。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class AnotherClass
{
public void Method()
{
SomeClass.ObsoleteMethod(); // Compiler error
}
[Obsolete("Avoid use",false)]
public void AnotherObsoleteMethod()
{
SomeClass.ObsoleteMethod(); // No error and no warning
}
} |
如果整个类标记为已过时,则也是如此:
1 2 3 4 5 6 7 8
| [Obsolete()]
public class ObsoleteClass
{
public void Method()
{
SomeClass.ObsoleteMethod(); // No error
}
} |
- 在检查了我的代码之后,我可以确认我所面临的情况。这就解释了当我在虚拟项目中测试属性时,它为什么能像预期的那样工作。这让我想知道,为什么这种行为在任何地方都没有记录下来,或者它是?
- 我找不到任何关于这个的信息,不久前我在重构一个库时偶然发现了这个。