CS0436: Введите конфликты с импортированным типом
Я включаю экземпляр одного и того же исходного файла в нескольких сборках, используя параметр "Добавить ссылку". Мне нужно включить экземпляр того же источника в эти сборки, потому что он отвечает за проверку лицензии, которая должна произойти внутри сборки. Выполнение вызовов лицензий через границы модулей может привести к риску.
Некоторые из проектов в моем решении, которые включают код, зависят от других модулей, которые также включают его, что приводит к предупреждению CS0436:
"Тип [type] в [полном пути licence.cs] конфликтует с импортированным введите [LicenceClass] в [проект зависимостей, в том числе licence.cs]. Использование типа, определенного в [licence.cs full path]".
Я попытался объявить псевдоним класса, но определения, внутренние для licence.cs, вызывают одно и то же предупреждение. В псевдониме должна быть ссылка на дублированное имя класса, которое вызывает одно и то же предупреждение.
Я знаю, что плохая практика дублирует источник между сборками, но в этом случае он преднамерен. Я предпочел бы сохранить центральный экземпляр, который каждая сборка связывается, а не специальный экземпляр с переименованными классами, чтобы избежать предупреждений.
Обходной путь, который у меня есть, - это просто игнорировать предупреждение с помощью #pragma
. Есть ли более элегантное решение?
Ответы
Ответ 1
Единственные временные конфликты возникают, когда два зависимых класса включают один и тот же класс. Существует два способа:
-
Отключите предупреждение в классах, вызывающих CS0436:
предупреждение об ошибке pragma 0436
-
У вас есть отдельный экземпляр класса, уникально названный в каждом клиентском проекте (нежелательный с точки зрения обслуживания).
EDIT: существует также решение: сделайте то, что предлагает Mark, и отметьте дубликаты классов internal
.
Ответ 2
Стоит отметить, что другой способ получить такие предупреждения - просто настроить проект в visual studio на ссылку: Ссылки → Решение → и т.д. и т.д. (как я понял, что этот драгоценный камень оставлен как упражнение для читателя...)
Visual Studio с удовольствием выполнит, только чтобы бросить стену предупреждений о типе, описанном OP во время сборки, что следует ожидать (при отражении), поскольку каждый отдельный класс и т.д. определяется дважды.
Ответ 3
У меня было веб-приложение, которое я преобразовал из ASP.NET 3.5 в 4.5, когда перешел на VS2015. Я начал рассматривать это как предупреждение, но решение все равно будет компилироваться. Циклических ссылок не было, и очистка решения и удаление папок bin
и obj
не помогли.
Оказывается, VS2015 не понравился некоторыми из моих классов в папке App_Code. Классы здесь имели такое же пространство имен, что и остальные веб-страницы в родительской папке. Как только я переместил эти классы из папки App_Code и на верхний уровень веб-приложения, предупреждения ушли.
Ответ 4
В .NET Core вы также можете отключить предупреждение в файле project.json:
{
"buildOptions":
{
"nowarn":
[
"CS0436"
]
}
}