【问题标题】:Naming conflict between System-namespace type and user-defined type in different assembly不同程序集中的系统命名空间类型和用户定义类型之间的命名冲突
【发布时间】:2012-02-22 15:16:04
【问题描述】:

我对名为 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;
        ...

    }

}

也许有人知道这种命名冲突的秘诀......

【问题讨论】:

  • 您可以将您的类型重命名为Operation
  • @ChaosPandion:不幸的是,这正是我无法接受的一件事(至少对我来说);-)
  • 谢谢大家的回答,他们都非常有帮助。然而,虽然大多数技术问题对我来说都是相对清晰的,但我认为有时我只是在寻找“最佳美学”的解决方案。

标签: c# coding-style namespaces assemblies conflict


【解决方案1】:

您可以使用namespace alias

using Example = ProjectName.Common;

class SomeClass {

    private Example.Action action;
    ...

}

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

using Act = ProjectName.Common.Action;

class SomeClass {

    private Act action;
    ...

}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我真的很喜欢这个主意。记得这些指导方针,这些指导方针建议只有更深的命名空间应该依赖于上层命名空间。我只是忘记了这可以或也应该适用于同一项目范围内的不同程序集。因此,对于这种情况,我认为这是解决我实际问题的最佳答案。谢谢!
    【解决方案3】:

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

    using Common = ProjectName.Common;
    

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

    using CAction = ProjectName.Common.Action
    

    您可以根据需要使用CActionAction

    【讨论】:

      【解决方案4】:

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

      using CommonAction = ProjectName.Common.Action;
      

      【讨论】:

        【解决方案5】:

        你可以通过这样做来区分你的Action和系统Action

        using MyAction = Project.Common.Action

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              试试using Action = ProjectName.Common.Action;

              您需要在每个需要引用该类的代码文件中指定这一点,并且如果该代码文件还需要使用 System.Action 委托,那么您可以在代码中将其完全限定为“@ 987654323@".

              当然,您也可以为 System.Action 代表指定别名,但我会发现只使用完全限定名称不会造成混淆。

              【讨论】:

                猜你喜欢
                • 2022-12-31
                • 2013-12-11
                • 1970-01-01
                • 1970-01-01
                • 2014-07-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多