.net 空间碰撞

xmd2e60i  于 12个月前  发布在  .NET
关注(0)|答案(3)|浏览(102)

在这种情况下,.NET怎么可能找到错误的MyType
我在一个项目中有一个类型A.B.C.D.MyType,我正在引用一个类型为A.B.MyType的DLL。在我的代码中没有任何using A.B;语句,我有using A.B.C.D;。当我编译时,编译器认为任何对MyType的裸引用都意味着A.B.MyType
我知道我可以重命名类或使用别名,但我想知道这是怎么可能的。有什么想法吗?

oogrdqng

oogrdqng1#

您是否在A.B命名空间下的命名空间中工作?(例如A.B.X)如果是,C#命名空间解析(ECMA-334 C# Language Specification : 10.8 10.8 Namespace and type names)表示:
.对于每个命名空间N,从出现命名空间或类型错误的命名空间开始,继续每个封闭的命名空间(如果有的话),并以全局命名空间结束,以下步骤将被评估,直到找到一个实体。
然后是:
如果K为零,并且名称空间声明包含将名称I与导入的名称空间或类型相关联的extern-alias-directive或using-aliasdirective,则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将被打印。
编辑:更改示例

oxalkeyp

oxalkeyp2#

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

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

然后在代码中引用TheTypeIWant
编辑:我刚刚尝试了“using MyType=A.B.C.D.MyType“选项,但它不起作用。上面的就很好了。

oxf4rvwz

oxf4rvwz3#

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

相关问题