Вы работаете в пространстве имен, которое находится под пространством имен A.B? (например, A.B.X), если это так, разрешения пространства имен C # ( ECMA-334 C # Спецификация языка: 10.8 10.8 Имена пространств имен и типов ) гласят:
... для каждого пространства имен N, начиная
с пространством имен, в котором
происходит namespace-or-typename,
продолжая с каждым вложением
пространство имен (если есть) и заканчивается
глобальное пространство имен, следующее
шаги оцениваются до тех пор, пока
расположенный ...
, а затем:
Если K равно нулю и пространство имен
декларация содержит
директива внешнего псевдонима или
using-aliasdirective, который связывает
имя я с импортированным пространством имен
или введите, то
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
будут напечатаны.
Редактировать: измененный пример