C# 命名空间优先级如下示例,按序号从小到大优先级从高到底。
假设使用类的地方位于最内层 namespace。
可以发现:
1. class C 的绑定决议,会按从C的完全限定名称开始,也就是最内层开始查找匹配,
然后逐层展开 namespace 直至 global 空间,其中会匹配路径上的第一个匹配。
2. 如果展开至 global 空间仍旧未找到,就会查找 using 指令引入的 namespace。
注意,using 指令彼此之间顺序无关没有优先级,所有经 using 指令获得的绑定优先级相同。
例如,下面 class C 若是经 using 指令得到的,比如 N3.C,N3.N6.C,N1.N4.C 三者的优先级一样,如果它们同时可用,则发生二义性编译错误。
结论,class 的查找路径从自身所处 namespace 开始,从自身到 golbal 根空间逐层展开匹配。
在 global 匹配失败后才查找 using 指令引入的 namesapce。因此,优先级从高到底:
自身 namespace > 自身路径逐层展开 namespace > global > using 指令(所有using优先级一样,若重名则发生二义性)
// test.cs
using N3;
using N3.N6;
using N1.N4;
using N1.N5;
using N1.N5.N2;
class C { } // 5
namespace N1
{
//public class C { } // 4
namespace N4
{
public class C { } // 6
}
namespace N5
{
//public class C { } // 3
namespace N2
{
//public class C { } // 2
public class T
{
//public class C { } // 1
static void M()
{
C c = new C(); // 使用处
}
}
}
}
}
namespace N3
{
public class C { } // 6
namespace N6
{
public class C { } // 6
}
}