在这种情况下,.NET如何找到错误的“MyType”?
我正在处理的项目中有一个A.B.C.D.MyType类型,我正在引用一个类型为A.B.MyType的DLL?我没有'使用A.B;'我的代码中的任何地方的语句,我确实有'使用A.B.C.D;'。当我编译时,编译器认为任何对'MyType'的裸引用都意味着'A.B.MyType'。
我知道我可以重命名该类或使用别名,但我想知道这是怎么回事。
有什么想法吗?
谢谢!
答案 0 :(得分:8)
您是否在A.B名称空间下的名称空间中工作? (例如A.B.X)如果是这样,C#名称空间解析(ECMA-334 C# Language Specification : 10.8 10.8 Namespace and type names)说:
...为每个命名空间N,开始 用其中的命名空间 发生namespace-or-typename, 继续每个封闭 命名空间(如果有的话),以。结尾 全局命名空间,如下 评估步骤直到实体为止 位于...
然后是:
如果K为零且名称空间 声明包含一个 extern-alias-directive或 使用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
。
编辑:更改了示例
答案 1 :(得分:3)
您的代码是在A.B
还是A.B.C
?如果是这样,那可能就是问题所在。使用像这样的using指令:
using TheTypeIWant = A.B.C.D.MyType;
然后只需在代码中引用TheTypeIWant
。
编辑:我刚刚尝试了“using MyType=A.B.C.D.MyType
”选项,但没有工作。以上情况很好。
答案 2 :(得分:0)
只是猜测:在项目属性中,“默认命名空间”是否设置为A.B?