命名空间冲突
本文关键字:冲突 命名空间 | 更新日期: 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?