命名空间冲突

问题描述 投票:0回答:3

在这种情况下,.NET 怎么可能发现错误的

MyType

我正在处理的项目中有一个类型

A.B.C.D.MyType
,并且我正在引用一个具有类型
A.B.MyType
的 DLL。我的代码中没有任何
using A.B;
语句,但我确实有
using A.B.C.D;
。当我编译时,编译器认为任何对
MyType
的裸引用都意味着
A.B.MyType

我知道我可以重命名该类或使用别名,但我想知道这怎么可能。有什么想法吗?

c# .net namespaces
3个回答
12
投票

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

...对于每个命名空间 N,开始 与其中的命名空间 命名空间或类型名称出现, 继续每个附件 命名空间(如果有),并以 全局命名空间,如下 评估步骤直到实体被 位于...

然后是:

如果 K 为零并且命名空间 声明包含一个 外部别名指令或 using-alias 关联指令 具有导入名称空间的名称 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();
        }
    }
}

编辑:在命名空间inside添加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

编辑:更改示例


6
投票

您的代码是否位于命名空间

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

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

然后只需在代码中引用

TheTypeIWant
即可。

编辑:我刚刚尝试了“

using MyType=A.B.C.D.MyType
”选项,但是不起作用。上面的还是可以的。


0
投票
猜测一下:在您的项目属性中,“默认命名空间”是否设置为 A.B ?

© www.soinside.com 2019 - 2024. All rights reserved.