C# 忽略ObsoleteAttribute编译器错误
我有一个用以下属性标记的枚举值。第二个参数指示编译器在使用该值时出错。我希望实现我的库的任何人都有这种行为,但我需要在我的库中使用此枚举值。我如何告诉编译器忽略库中两种用法的过时错误C# 忽略ObsoleteAttribute编译器错误,c#,C#,我有一个用以下属性标记的枚举值。第二个参数指示编译器在使用该值时出错。我希望实现我的库的任何人都有这种行为,但我需要在我的库中使用此枚举值。我如何告诉编译器忽略库中两种用法的过时错误 public enum Choices { One, Two, [ObsoleteAttribute("don't use me", true)] Three, Four } 解决方案(谢谢大家) Private是这样一个单独的常量: private const Cho
public enum Choices
{
One,
Two,
[ObsoleteAttribute("don't use me", true)]
Three,
Four
}
解决方案(谢谢大家)
Private是这样一个单独的常量:
private const Choices BackwardsCompatibleThree = (Choices) 3;
请注意,其他任何人都可以做同样的事情。我看到的是,您正在将此公共枚举用于私有逻辑,在淘汰它之后,您在内部仍然需要该逻辑 我看到两种选择:
- 当您将其用于分支逻辑时,将其映射到私有枚举。你应该能够直接从一个演员到另一个演员
- 从int强制转换它,这样就永远不会在代码中使用实际的枚举值
正如Jon在上文中指出的,任何使用您的库的人都可以,也将(我知道您在哪里工作)以任何方式对其进行黑客攻击。SoftwareEdi正确地指出,当过时属性设置为错误时,这将不起作用。以下“答案”仅在过时通知作为警告发出时有效
在Visual Studio中,您可以按每个项目执行此操作:
其他项目将继续收到过时的警告,但此项目不会。请注意,这将禁用所有过时的警告。这可能不是世界上最漂亮的解决方案,但您可以尝试通过将值分配给枚举,然后强制执行内部调用来欺骗编译器。例如,此应用程序运行:
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
TestMethod((Choices)3);
}
private static int TestMethod(Choices choice) {
return 1;
}
}
public enum Choices
{
One = 1,
Two = 2,
[ObsoleteAttribute("don't use me", true)]
Three = 3,
Four = 4
}
}
我认为Enum.Parse可以工作,但它会出现运行时错误,所以不要这样做:
(Choices)Enum.Parse(typeof(Choices), "Choices.Three")
我没有使用过时枚举的经验,因此我建议对此进行一些不错的测试。使用#pragma禁用特定代码周围的警告怎么样
#pragma warning disable 0612
// Call obsolete type/enum member here
#pragma warning restore 0612
请注意,这仅适用于类型和枚举成员。据我所知,这对其他类型成员(如方法、属性等)不起作用。我想你指的是(选项)Enum.Parse(typeof(选项),“三”)你说得对,我现在觉得有点傻,但就是这样。Parse“三”起作用,但我需要switch语句的常量。根本问题是没有“对”回答。到目前为止,每个解决方案要么看起来像是一个黑客,要么有自己的警告(或者两者都有)。考虑到它被设置为一个错误,而不是一个警告,这会起作用吗?你完全正确!我真的应该更仔细地阅读这些问题。。。谢谢你提供的信息。看起来我所有的选择都是一个黑客。但是使用过时的属性是一种攻击,因为我希望在将来重新启用此功能。通过“FindAllReferences”,您可以以最快的回复、简单的实现和轻松的跟踪赢得胜利。。。乔恩不需要积分!我离接管世界只有30岁了如果您这样做,那么将其标记为[过时]可能是一个好主意,当他们这样做时,他们会得到一个例外!(我控制代码的一个服务器组件将检查它。)当ObsoleteAttribute为Error=true标志时,这不起作用。它应该是0618。看见
#pragma warning disable 0612
// Call obsolete type/enum member here
#pragma warning restore 0612