当前位置:  开发笔记 > 编程语言 > 正文

命名空间冲突

如何解决《命名空间冲突》经验,为你挑选了1个好方法。

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

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

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

有任何想法吗?

谢谢!



1> Pop Catalin..:

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

...对于每个名称空间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将被打印.

编辑:更改示例

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有