在这种情况下,.NET 怎么可能找到错误的“MyType”?
我正在处理的项目中有一个 ABCDMyType 类型,并且我正在引用一个具有 ABMyType 类型的 DLL?我没有任何“使用 AB;” 在我的代码中的任何地方声明,我确实有'使用 ABCD;'。当我编译时,编译器认为任何对“MyType”的裸引用都意味着“ABMyType”。
我知道我可以重命名类或使用别名,但我想知道这怎么可能。
有任何想法吗?
谢谢!
在这种情况下,.NET 怎么可能找到错误的“MyType”?
我正在处理的项目中有一个 ABCDMyType 类型,并且我正在引用一个具有 ABMyType 类型的 DLL?我没有任何“使用 AB;” 在我的代码中的任何地方声明,我确实有'使用 ABCD;'。当我编译时,编译器认为任何对“MyType”的裸引用都意味着“ABMyType”。
我知道我可以重命名类或使用别名,但我想知道这怎么可能。
有任何想法吗?
谢谢!
您是否在 AB 命名空间下的命名空间中工作?(例如 ABX)如果是这样,C# 命名空间解析(ECMA-334 C# 语言规范:10.8 10.8 命名空间和类型名称)说:
... 对于每个命名空间 N,从出现命名空间或类型名称的命名空间开始,继续每个封闭的命名空间(如果有),并以全局命名空间结束,评估以下步骤,直到找到一个实体。 ..
然后是:
如果 K 为零并且命名空间声明包含将名称 I 与导入的命名空间或类型相关联的 extern-alias-directive 或 using-aliasdirective,则命名空间或类型名称引用该命名空间或类型
这意味着名称解析从当前命名空间开始,搜索直到根目录的所有命名空间,并且只有在这种分层搜索结束后,才会搜索使用该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
被打印。
编辑:更改示例
您的代码在命名空间中A.B
还是A.B.C
?如果是这样,那可能就是问题所在。使用这样的 using 指令:
using TheTypeIWant = A.B.C.D.MyType;
然后只需TheTypeIWant
在您的代码中引用即可。
编辑:我刚刚尝试了“ using MyType=A.B.C.D.MyType
”选项,但这不起作用。不过上面还不错。
只是猜测:在您的项目属性中,“默认命名空间”是否设置为 AB ?