Ответ 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/