命名空间冲突
在这种情况下,.NET如何找到错误的“MyType”?
我在一个项目中有一个ABCDMyType类型,我正在引用一个ABMyType类型的DLL? 我没有’使用AB;’ 在我的代码中的任何地方的语句,我确实’使用ABCD;’。 当我编译时,编译器认为任何对’MyType’的裸引用都意味着’ABMyType’。
我知道我可以重命名该类或使用别名,但我想知道这是怎么可能的。
有任何想法吗?
谢谢!
您是在AB命名空间下的命名空间中工作吗? (例如ABX)如果是这样的话,C#命名空间解析( ECMA-334 C#语言规范:10.8 10.8命名空间和类型名称 )说:
…对于每个名称空间N,从发生namespace-or-typename的名称空间开始,继续使用每个封闭的名称空间(如果有),并以全局名称空间结束,评估以下步骤直到找到实体。 ..
然后是:
如果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
将被打印。
编辑:更改示例
您的代码是在命名空间AB
还是ABC
? 如果是这样,那可能就是问题所在。 使用这样的using指令:
using TheTypeIWant = ABCDMyType;
然后在代码中引用TheTypeIWant
。
编辑:我刚刚尝试了“ using MyType=ABCDMyType
”选项,但这不起作用。 以上情况很好。
只是猜测:在您的项目属性中,“默认命名空间”是否设置为AB?