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"
    ]
  }
}