在这种情况下,.NET怎么可能找到错误的MyType?我在一个项目中有一个类型A.B.C.D.MyType,我正在引用一个类型为A.B.MyType的DLL。在我的代码中没有任何using A.B;语句,我有using A.B.C.D;。当我编译时,编译器认为任何对MyType的裸引用都意味着A.B.MyType。我知道我可以重命名类或使用别名,但我想知道这是怎么可能的。有什么想法吗?
MyType
A.B.C.D.MyType
A.B.MyType
using A.B;
using A.B.C.D;
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
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将被打印。编辑:更改示例
Ns1.Foo.Foo2
oxalkeyp2#
你的代码是在命名空间A.B还是A.B.C中?如果是这样,这可能就是问题所在。像这样使用using指令:
A.B
A.B.C
using TheTypeIWant = A.B.C.D.MyType;
然后在代码中引用TheTypeIWant。编辑:我刚刚尝试了“using MyType=A.B.C.D.MyType“选项,但它不起作用。上面的就很好了。
TheTypeIWant
using MyType=A.B.C.D.MyType
oxf4rvwz3#
只是猜测:在您的项目属性中,“默认名称空间”是否设置为A.B?
3条答案
按热度按时间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
将被打印。编辑:更改示例
oxalkeyp2#
你的代码是在命名空间
A.B
还是A.B.C
中?如果是这样,这可能就是问题所在。像这样使用using指令:然后在代码中引用
TheTypeIWant
。编辑:我刚刚尝试了“
using MyType=A.B.C.D.MyType
“选项,但它不起作用。上面的就很好了。oxf4rvwz3#
只是猜测:在您的项目属性中,“默认名称空间”是否设置为A.B?