c# - 如何别名枚举名称以覆盖具有相同名称的本地命名空间枚举?
问题描述
我正在做一个重大的重构,我将一个名为“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# 编译器不支持这个?不是每个非限定名称都真的是别名,我不应该能够覆盖当前命名空间中名称的别名吗?
解决方案
为了相对容易地解决这个问题,我只是将“Main.TestEnum”移动到“SomeUnusedNameSpace.TestEnum”。这将两个版本的 TestEnum 移出“Main”命名空间,这意味着对“TestEnum”的任何引用都必须是显式的,因为编译器无法自动默认为当前命名空间中的版本。我必须添加“使用 TestEnum = Library.TestEnum;” 到相当多的文件来修复编译器错误,但它是添加了一行而不是巨大的重命名,这使得合并更容易。
我仍然不知道这是编译器“错误”还是只是我应该向编译器团队提出的请求,但我觉得“使用”别名应该覆盖当前命名空间中的符号,或者至少引发编译器错误如果别名与当前符号名称冲突,或者至少警告别名不会做任何事情。
推荐阅读
- c++ - Arduino 伺服对象在我自己的库中不起作用
- python - 如何在python中将字符串变量打印为f字符串
- javascript - 从javascript中生成的数据中获取最后一个数组
- c - “free(): double free 在 tcache 2 中检测到”是什么意思?
- javascript - 如何编写猫鼬更新来更新整个文档,包括各种子文档
- go - 将 go 文件放在模块路径上是一个好习惯吗?
- sorting - 谷歌表格 - 查询,添加一个单元格以隐藏一行
- tensorflow - 使用 image_dataset_from_directory 时出现 OOM
- git - 在 mysite.com/ 部署 GitHub Pages 站点
- dapper - 使用 Dapper SQL Builder 的 BETWEEN 动态 WHERE 子句