命名空间冲突

本文关键字:冲突 命名空间 | 更新日期: 2023-09-27 17:48:48

在这种情况下,.NET怎么可能找到错误的"MyType"?

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

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

有什么想法吗?

谢谢!

命名空间冲突

您是否在.B命名空间下的命名空间中工作?(例如A.B.X)如果是这样,C#命名空间解析(ECMA-334C#语言规范:10.810.8命名空间和类型名称)说:

对于每个命名空间N,从其中的命名空间出现名称空间或类型名称,继续每个封闭命名空间(如果有),并以结尾全局命名空间,如下将评估步骤,直到实体已定位。。。

然后是:

如果K为零并且命名空间声明包含extern alias指令或使用关联的aliasdirectory具有导入命名空间的名称I或键入,然后命名空间或类型名称指的是命名空间或类型

这意味着名称解析从当前名称空间开始,搜索所有直到根的名称空间,只有在该分层搜索结束后,才会搜索使用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();
        }
    }
}

并且将打印CCD_ 2。

编辑:更改示例

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

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

那么只需参考代码中的TheTypeIWant

编辑:我刚刚尝试了"using MyType=A.B.C.D.MyType"选项,但不起作用。不过,上面的内容还可以。

只是猜测:在您的项目属性中,"默认名称空间"是否设置为a.B?