命名空间冲突

时间:2008-11-04 16:54:53

标签: c# .net namespaces

在这种情况下,.NET如何找到错误的“MyType”?

我正在处理的项目中有一个A.B.C.D.MyType类型,我正在引用一个类型为A.B.MyType的DLL?我没有'使用A.B;'我的代码中的任何地方的语句,我确实有'使用A.B.C.D;'。当我编译时,编译器认为任何对'MyType'的裸引用都意味着'A.B.MyType'。

我知道我可以重命名该类或使用别名,但我想知道这是怎么回事。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:8)

您是否在A.B名称空间下的名称空间中工作? (例如A.B.X)如果是这样,C#名称空间解析(ECMA-334 C# Language Specification : 10.8 10.8 Namespace and type names)说:

  

...为每个命名空间N,开始   用其中的命名空间   发生namespace-or-typename,   继续每个封闭   命名空间(如果有的话),以。结尾   全局命名空间,如下   评估步骤直到实体为止   位于...

然后是:

  

如果K为零且名称空间   声明包含一个   extern-alias-directive或   使用aliasdirective联合   名称I带有导入的命名空间   或者输入,然后输入   namespace-or-type-name是指那个   命名空间或类型

这意味着名称解析从当前命名空间开始,并搜索所有命名空间到根,并且只有在此分层搜索结束后,才会搜索使用using子句导入的命名空间。

以下示例打印“Ns1.Foo”

using Ns1.Foo.Foo2;

namespace Ns1.Foo
{
    class Foo
    {
        public void Print()
        {
            System.Console.WriteLine("Ns1.Foo");
        }
    }
}

namespace Ns1.Foo.Foo2
{
    class Foo
    {
        public void Print()
        {
            System.Console.WriteLine("Ns1.Foo.Foo2");
        }
    }
}

namespace Ns1.Foo.Bar
{
    class Bar
    {
        public void Print()
        {
            new Foo().Print();
        }

        static void Main()
        {
            new Bar().Print();
        }
    }
}

编辑:在命名空间中添加using子句 ,这将使得在完成当前命名空间的分层搜索之前搜索命名空间。将示例更改为:

namespace Ns1.Foo.Bar
{
    using Ns1.Foo.Foo2;
    class Bar
    {
        public void Print()
        {
            new Foo().Print();
        }

        static void Main()
        {
            new Bar().Print();
        }
    }
}

将打印Ns1.Foo.Foo2

编辑:更改了示例

答案 1 :(得分:3)

您的代码是在A.B还是A.B.C?如果是这样,那可能就是问题所在。使用像这样的using指令:

using TheTypeIWant = A.B.C.D.MyType;

然后只需在代码中引用TheTypeIWant

编辑:我刚刚尝试了“using MyType=A.B.C.D.MyType”选项,但没有工作。以上情况很好。

答案 2 :(得分:0)

只是猜测:在项目属性中,“默认命名空间”是否设置为A.B?