为什么自动包含根名称空间

时间:2018-01-29 11:09:47

标签: c# .net compiler-errors compilation

我的一位同事刚刚遇到一个奇怪的编译器怪癖,它正在导入看起来像“根”命名空间的东西。

问题在于,当我们添加对共享库的引用时,它的命名空间为Root.Security,它会在每个文件中抱怨使用类Root.Entity.X(即使它没有using Rootusing Root.Security

实施例

Root.Entities大会

Security.cs

namespace Root.Entities
{
    public class Security { } // Represents a Security in the sense of financial instrument
}

Root.Security大会

此程序集具有Active Directory +权限共享帮助程序

SecurityHelper.cs

namespace Root.Security
{
    public class SecurityHelper { } // AD/Permission helper
}

Root.Gui大会

Main.cs

using Root.Entities;

namespace Root.Gui
{
    public class Main
    {
        public Main()
        {
            // The following causes an error 
            // if Root.Security is add as a reference to the project.
            // even without adding `using Root.Security`
            var security = new Security();
        }
    }
}

问题

我的问题是,为什么编译器抛出错误并选择Security作为命名空间,即使我们在任何地方都没有using Rootusing Root.Security!它似乎是自动在某处添加using Root

N.B。目前我们已根据设置using SecurityEntity = Root.Entities.Security修正了

1 个答案:

答案 0 :(得分:1)

我无法解释"为什么?" - 我可以重复它,但有一些解决方法

选项1:完全符合类型:

var security = new Root.Entities.Security();

选项2:将using指令移到命名空间声明中:

namespace Root.Gui
{
    using Root.Entities;
    public class Main
    {
        public Main()
        {
            // The following causes an error 
            // if Root.Security is add as a reference to the project.
            // even without adding `using Root.Security`
            var security = new Security();
        }
    }
}

我有点惊讶using别名方法没有修复它:

using Security = Root.Entities.Security;

但你可以使用选项3作弊:

using SecurityRenamed = Root.Entities.Security;
...
var security = new SecurityRenamed();