Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 忽略ObsoleteAttribute编译器错误_C# - Fatal编程技术网

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中,您可以按每个项目执行此操作:

  • 转到项目的“项目属性”页,以便能够抑制其上的过时警告
  • 转到“生成”选项卡:错误和警告:抑制警告
  • 在这种情况下,请输入警告号0612

  • 其他项目将继续收到过时的警告,但此项目不会。请注意,这将禁用所有过时的警告。

    这可能不是世界上最漂亮的解决方案,但您可以尝试通过将值分配给枚举,然后强制执行内部调用来欺骗编译器。例如,此应用程序运行:

    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