Использовать типы одинакового имени и пространства имен в 2 сборках .NET
Из любопытства я создал 2 сборки, у которых есть класс (Class1
) с тем же самым пространством имен (Library1
). Затем я создаю другого клиента, ссылающегося на эти 2 сборки, и попытаюсь создать экземпляр Class1
.
Компилятор, что неудивительно, дает мне ошибку компиляции об неоднозначной ссылке. Есть ли способ явно указать тип в сборке, который я хочу использовать, чтобы избежать двусмысленности?
Примечание. Я знаю, что это редко, если вообще вообще, происходит на практике. Это просто вопрос из любопытства о языковой функции.
Ответы
Ответ 1
Я думаю, вы должны использовать extern alias, чтобы обернуть пространства имен сборки за пределами глобального пространства имен. Вот как:
-
В проекте, который ссылается на 2 сборки, выберите один из них в разделе "Ссылки", а в окне "Свойства" измените значение "Псевдонимы" с global
на, скажем, global, Library1a
.
-
Сделайте то же самое для другой ссылки, но дайте ей другой псевдоним - отпустите global, Library1b
для нашего примера.
-
Вставьте extern alias Library1a;
и/или extern alias Library1b;
в качестве первых двух строк любых классов, которые потребляют сборки.
-
При доступе к неоднозначным членам, укажите пространство имен с Library1a.
или Library1b.
. Примеры: Library1a.Library1.Class1...
Library1b.Library1.Class1...
Ответ 2
Это происходит на практике и является настоящей болью, внешний псевдоним не всегда может решить проблему. Здесь один пример того, где это проблема Duplicate Namepaces.