在不同的程序集中命名System-namespace类型和用户定义类型之间的冲突

时间:2012-02-22 15:16:05

标签: c# coding-style namespaces assemblies conflict

我对名为Action的类型的名称解析有疑问。虽然项目处于早期状态,并且所有内容都在同一项目中声明,但编译器始终更喜欢我自己的类。但是,由于必须将项目分成不同的程序集(即ProjectName.Common,ProjectName.Engine等),因此会出现System.Action和ProjectName.Common.Action之间的命名冲突。

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

代码示例:

using System;
...

namespace ProjectName.Engine {

    using ProjectName.Common;

    class SomeClass {

        private Action action;
        ...

    }

}

也许有人知道这种命名冲突的方法......

8 个答案:

答案 0 :(得分:4)

您可以使用namespace alias

using Example = ProjectName.Common;

class SomeClass {

    private Example.Action action;
    ...

}

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

using Act = ProjectName.Common.Action;

class SomeClass {

    private Act action;
    ...

}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

您可以将using与别名一起使用:

using Common = ProjectName.Common;

然后,将System.Action简称为Action,将您的操作称为Common.Action。如果您可以仅在某些部分更改名称​​ little

using CAction = ProjectName.Common.Action

您可以根据需要使用CActionAction

答案 3 :(得分:1)

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

using CommonAction = ProjectName.Common.Action;

答案 4 :(得分:1)

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

using MyAction = Project.Common.Action

答案 5 :(得分:1)

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

    using System;
    using ProjectName.Common
    ...

    namespace ProjectName.Engine {

        using Action = ProjectName.Common.Action;

        class SomeClass {

            private Action action;
            ...

        }

   }

答案 6 :(得分:1)

无论如何,我建议你制作演员。每当你有不明确的引用时,都应该这样做,特别是在与System中具有相同名称的情况下。否则,您要求任何必须进入并维护代码的新程序员感到困惑。如果未明确构建,新程序员将看到Action并假设系统版本。虽然这更加冗长,但它以清晰的方式表达了代码及其意图。这只是我的两分钱。您可以像使用其他人建议的那样使用别名以相同的方式完成此任务。

答案 7 :(得分:0)

尝试using Action = ProjectName.Common.Action;

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

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