首页 > 解决方案 > 如何别名枚举名称以覆盖具有相同名称的本地命名空间枚举?

问题描述

我正在做一个重大的重构,我将一个名为“Main.TestEnum”的枚举替换为另一个命名空间中的一个名为“Library.TestEnum”的枚举。我现在需要暂时保留两个枚举,以后我可以用“Library.TestEnum”替换每个实例。

我希望我可以使用“使用”别名在枚举之间来回切换:

using TestEnum = Library.TestEnum; //Create the alias
namespace Main {
class Program
    {
        static void Main(string[] args)
        {
            TestEnum testEnum = TestEnum.Uninitialized;
            Console.WriteLine(testEnum.GetType()); //Always outputs Main.TestEnum!
        }
    }
}

尽管有别名,但对于“Main”命名空间中的代码,非限定名称“TestEnum”总是指“Main.TestEnum”,而不是“Library.TestEnum”。如果在您当前的命名空间中使用该名称定义了其他内容,则别名似乎不起作用。:(

我可以浏览我的所有代码并用“Library.TestEnum”搜索和替换“TestEnum”,但这看起来很烦人,使代码更难阅读,并且让我不得不触摸使用枚举的每个文件(有很多代码都在使用它。)

有谁知道解决这个问题?为什么 C# 编译器不支持这个?不是每个非限定名称都真的是别名,我不应该能够覆盖当前命名空间中名称的别名吗?

标签: c#enums

解决方案


为了相对容易地解决这个问题,我只是将“Main.TestEnum”移动到“SomeUnusedNameSpace.TestEnum”。这将两个版本的 TestEnum 移出“Main”命名空间,这意味着对“TestEnum”的任何引用都必须是显式的,因为编译器无法自动默认为当前命名空间中的版本。我必须添加“使用 TestEnum = Library.TestEnum;” 到相当多的文件来修复编译器错误,但它是添加了一行而不是巨大的重命名,这使得合并更容易。

我仍然不知道这是编译器“错误”还是只是我应该向编译器团队提出的请求,但我觉得“使用”别名应该覆盖当前命名空间中的符号,或者至少引发编译器错误如果别名与当前符号名称冲突,或者至少警告别名不会做任何事情。


推荐阅读