2012-02-22 84 views
2

我有一个名为Action的类型的名称解析有问题。虽然项目处于早期状态,并且所有内容都在同一个项目中声明,但编译器总是首选我自己的类。然而,由于需要将项目分成不同的程序集(即ProjectName.Common,ProjectName.Engine等),System.Action和ProjectName.Common.Action之间的命名冲突出现了。不同程序集中系统名称空间类型和用户定义类型之间的命名冲突

我发现我可以在任何项目文件的命名空间声明内显式导入项目内部命名空间,而系统仍然像IDE最初创建的那样导入全局范围。事实上,这种方法很有效,但看起来不太优雅。有没有更好的方法来解决这个问题?重命名我的Action类是不是一个真正的可接受的解决方案,因为它是一个相当普遍的域名,并没有什么特别喜欢数学,即等

代码示例:

using System; 
... 

namespace ProjectName.Engine { 

    using ProjectName.Common; 

    class SomeClass { 

     private Action action; 
     ... 

    } 

} 

也许有人知道这些食谱一种命名冲突......

+0

您可以将您的类型重命名为“Operation”。 – ChaosPandion 2012-02-22 15:20:34

+0

@ChaosPandion:不幸的是,这正是一件让人无法接受的事情(至少对我而言);-) – 2012-02-22 18:00:39

+0

谢谢大家的回答,他们都非常有帮助。然而,虽然大多数技术问题事先都比较清晰,但我认为有时候我只是在寻找“最佳美学”解决方案。 – 2012-02-22 18:03:54

回答

3

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

+0

我非常喜欢这个想法。记住我遵循这些准则,其中建议只有更深的名称空间应该取决于高位名称空间。我只是忘记了这可以或应该适用于同一个项目范围内的不同程序集。所以对于这种情况,我认为这是我的实际问题的最佳答案。谢谢! – 2012-02-22 17:58:34

4

您可以使用namespace alias

using Example = ProjectName.Common; 

class SomeClass { 

    private Example.Action action; 
    ... 

} 

或者,一个类型别名为只有类型:

using Act = ProjectName.Common.Action; 

class SomeClass { 

    private Act action; 
    ... 

} 
1

可以使用using用别名:

using Common = ProjectName.Common; 

然后参考System.Action简单地Action,并作为Common.Action你的行动。如果没有问题,在仅某些部分改变名称的

using CAction = ProjectName.Common.Action 

而且你可以CActionAction必要时使用。

1

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

using CommonAction = ProjectName.Common.Action; 
1

你可以做你的行动和系统行动区分这

using MyAction = Project.Common.Action

0

尝试using Action = ProjectName.Common.Action;

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

当然,您也可以为System.Action委托人提供别名,但我会发现仅使用完全限定名称就不那么容易混淆了。

1

您所做的是处理此问题的适当方法。您也可以使用别名来给出一个临时名称,或者给编译器一个暗示你喜欢哪一个。这节省了您在ProjectName.Common中优先选择System中的所有类型的麻烦。

using System; 
    using ProjectName.Common 
    ... 

    namespace ProjectName.Engine { 

     using Action = ProjectName.Common.Action; 

     class SomeClass { 

      private Action action; 
      ... 

     } 

    } 
1

无论如何,我会建议你的演员明确。每当你有不明确的引用时,应该这样做,尤其是在与系统中的名称相同的情况下。否则,你需要任何必须进入并维护代码的新程序员混淆。新程序员将看到Action,并假定系统版本没有明确构建。虽然这比较冗长,但它以清晰的方式表达了代码及其意图。这只是我的两美分。您可以使用其他人建议的别名以相同的方式完成此操作。

相关问题