Когда существуют одноименные пространства имен (в текущей области), как ссылаться на любой из них?

Я имею:

namespace Book {
   ...
}

    ...
    ...



namespace Company 
{ 
    public class Book {

    }
    ...
    ...
    ...
    ...
    ...
    ...
    public class MyBook : Book.smth
    {
    }
}

Как я это сделал, поскольку MyBook унаследовал пространство имен Book верхнего уровня, а не Company?

Ответ 1

Во-первых, в идеале вы не попадаете в эту плохую ситуацию в первую очередь. Попытайтесь назвать свои пространства имен и классы, чтобы они не конфликтуют с вашими зависимостями! Но иногда это неизбежно, особенно когда зависимость добавляет функцию, которую вы уже реализовали.


Техника № 1:

Вы можете сделать это с помощью global:: modifier.

namespace Company 
{ 
  namespace Xyz 
  { 
    public class DefaultClass {} 
  }
  public class myClass: global::Xyz.DefaultClass

Теперь Xyz.DefaultClass относится к верхнему уровню Xyz.DefaultClass, а не к Company.Xyz.DefaultClass


Техника № 2:

Используйте директиву с использованием псевдонима, либо в пространстве имен:

using TheOtherXyz = Xyz;
namespace Company {
  namespace Xyz 
  { 
    public class DefaultClass {} 
  }
  public class MyClass : TheOtherXyz.DefaultClass

или по классу:

using TheOtherDefault = Xyz.DefaultClass;
namespace Company {
  namespace Xyz 
  { 
    public class DefaultClass {} 
  }
  public class MyClass : TheOtherDefault

Обратите внимание, что второй вариант не работает на общих классах. Ты можешь сказать

using StringList = System.Collections.Generic.List<String>

но вы не можете сказать

using MyList<T> = System.Collections.Generic.List<T>

для создания общего псевдонима. Это совершенно разумная функция, она просто никогда не была высокоприоритетной, чтобы добавить ее.


Вопрос, который вы не задали, я все равно отвечу:

Что делать, если у меня есть пространство имен N с классом C в двух разных сборках, на которые я ссылаюсь? NC теперь неоднозначна и global:: не помогает, и ни одна из них не использует директиву alias.

В этом неудачном случае вы используете директиву altern extern, о котором вы можете прочитать здесь.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extern-alias


Если вас интересуют другие вещи, которые могут быть ужасно ошибочными, когда вы столкнулись с подобным именем, см. Мои статьи по этому вопросу здесь:

https://blogs.msdn.microsoft.com/ericlippert/tag/namespaces/