不同程序集中的系统命名空间类型和用户定义类型之间存在命名冲突



我在一个名为Action的类型的名称解析方面遇到了问题。当项目处于早期状态,并且所有内容都在同一个项目中声明时,编译器总是更喜欢我自己的类。然而,由于有必要将项目分离为不同的程序集(即ProjectName.Common、ProjectName.Engine等),因此出现了System.Action和ProjectName.Com.Action之间的命名冲突。

我发现,我可以在任何项目文件的命名空间声明中显式导入项目内部命名空间,而System仍然是在IDE最初创建的全局范围中导入的。事实上,这是有效的,但看起来不是很优雅。有没有更好的方法来解决这个问题?重命名我的Action类并不是一个真正可以接受的解决方案,因为它是一个非常常见的域名,没有任何特殊的东西,比如Math等。

代码示例:

using System;
...
namespace ProjectName.Engine {
    using ProjectName.Common;
    class SomeClass {
        private Action action;
        ...
    }
}

也许有人知道这种命名冲突的配方。。。

您可以使用名称空间别名:

using Example = ProjectName.Common;
class SomeClass {
    private Example.Action action;
    ...
}

或者,仅Action类型的类型别名:

using Act = ProjectName.Common.Action;
class SomeClass {
    private Act action;
    ...
}

考虑将Action类放在根ProjectName命名空间中,而不是放在ProjectName.Common命名空间中。如果这样做,那么在ProjectName命名空间或任何子命名空间中,Action将引用ProjectName.Action而不是System.Action,并且不必将using指令添加到所有其他源文件中。

您可以使用别名为的using

using Common = ProjectName.Common;

然后将System.Action简称为Action,将您的操作称为Common.Action。如果您同意只在某些部分更改名称,则会有一个

using CAction = ProjectName.Common.Action

您可以根据需要使用CActionAction

您可以使用别名,而不必指定完整的命名空间:

using CommonAction = ProjectName.Common.Action;

您可以通过执行此来区分您的操作和系统操作

using MyAction = Project.Common.Action

您所做的是处理此问题的适当方法。您也可以使用别名来提供临时名称,或者向编译器提示您喜欢哪个名称。这样就省去了在ProjectName.Common中选择所有类型而不是System的麻烦。

    using System;
    using ProjectName.Common
    ...
    namespace ProjectName.Engine {
        using Action = ProjectName.Common.Action;
        class SomeClass {
            private Action action;
            ...
        }
   }

我建议您无论如何都要显式转换。任何时候,只要有不明确的引用,就应该这样做,尤其是在与System中的名称相同的情况下。否则,你会要求任何新的程序员来维护代码。如果没有明确构建,新程序员将看到Action并假设系统版本。虽然这更为冗长,但它以清晰的方式表达了代码及其意图。不过那只是我的两毛钱。您可以像其他人建议的那样使用别名来实现这一点。

尝试using Action = ProjectName.Common.Action;

您需要在每个需要引用该类的代码文件中指定此项,如果该代码文件还需要使用System.Action委托,那么您可以在代码中将其完全限定为"System.Action"。

当然,您也可以为System.Action委托提供一个别名,但我会发现只使用完全限定的名称不那么令人困惑。

最新更新