命名空间冲突

5
在这种情况下,.NET如何可能找到错误的'MyType'?
我在一个项目中有一个类型A.B.C.D.MyType,并引用了一个有类型A.B.MyType的DLL。 我的代码中没有任何“using A.B;”语句,但我确实使用了“using A.B.C.D;”。 当我编译时,编译器认为任何裸露的对'MyType'的引用意味着'A.B.MyType'。
我知道我可以重命名类或使用别名,但我想知道这是如何可能的。
有任何想法吗?
谢谢!
3个回答

12

你是否在 A.B 命名空间下工作?(例如A.B.X)如果是的话,C#命名空间解析(ECMA-334 C# Language Specification : 10.8 10.8 Namespace and type names)指出:

对于每个命名空间N,从包含该命名空间或类型名称的命名空间开始,逐层搜索其所有封闭命名空间(如果有),最后到全局命名空间,一直执行以下步骤,直到找到实体…

然后接着是:

如果K为零,并且命名空间声明包含extern-alias-directive或using-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

编辑:更改了示例。


6

你的代码是否在命名空间A.BA.B.C中?如果是,那可能就是问题所在。使用如下的using指令:

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

那么在你的代码中,只需引用TheTypeIWant即可。

编辑:我刚刚尝试了"using MyType=A.B.C.D.MyType"选项,但是这种方式并不可行。上述方式可行。


我觉得这个不适用于泛型类,对吧? - Will I Am
@WillIAm:如果你想让别名仍然是通用的,那就不行,如果你明白我的意思的话。但是回答问题,没有表明涉及到泛型。一个使用泛型的具体例子可能会导致不同的解决方案。 - Jon Skeet

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接