CA1418: проверка совместимости платформ

Свойство Значение
Идентификатор правила CA1418
Заголовок Проверка совместимости платформ
Категория Совместимость
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предупреждение

Причина

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

Описание правила

Атрибуты совместимости платформы, производные от OSPlatformAttribute, используют строковые литералы для имен платформ операционной системы (ОС) с необязательной частью версии. Строка должна состоять из известного имени платформы без указания части версии или с указанием допустимой части.

Список известных имен платформ заполняется из двух источников:

  • Часть PlatformName методов условий OperatingSystem с именем OperatingSystem.Is<PlatformName>[VersionAtLeast](). Например, метод условий OperatingSystem.IsWindows() добавляет Windows в список известных имен платформ.

  • Группа элементов MSBuild проекта с элементами SupportedPlatform, включая список MSBuild SupportedPlatforms по умолчанию. Это относящиеся к проекту знания об известных платформах. Это позволяет авторам библиотек классов добавлять дополнительные платформы в список известных платформ. Например:

      <ItemGroup>
        <SupportedPlatform Include="PlatformName" />
      </ItemGroup>
    

Если строка платформы содержит версию, она должна быть допустимой Version в следующем формате: major.minor[.build[.revision]].

Нарушения

  • Solaris — это неизвестное имя платформы, поскольку оно не входит в список MSBuild SupportedPlatforms по умолчанию и не существует метода условия с именем OperatingSystem.IsSolaris() в классе OperatingSystem.

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • Android является известной платформой, так как существует метод условия OperatingSystem.IsAndroid() в типе OperatingSystem. Однако часть версии не является допустимой. Она должна содержать по крайней мере два целых числа, разделенных точкой.

    [UnsupportedOSPlatform("Android10")] // Warns: Version '10' is not valid for platform 'Android'. Use a version with 2-4 parts for this platform.
    public void DoesNotWorkOnAndroid() { }
    
  • Linux — это известное имя платформы, поскольку оно входит в список MSBuild SupportedPlatforms по умолчанию и существует метод условия с именем OperatingSystem.IsLinux(). Однако не существует методов условий с версиями, например System.OperatingSystem.IsLinuxVersionAtLeast(int,int), для платформы Linux, поэтому часть версии не поддерживается в Linux.

    [SupportedOSPlatform("Linux4.8")] // Warns: Version '4.8' is not valid for platform 'Linux'. Do not use versions for this platform.
    public void LinuxApi() { }
    

Устранение нарушений

  • Измените платформу на известное имя.

  • Если имя платформы указано правильно и вы хотите сделать его известной платформой, добавьте его в список MSBuild SupportedPlatforms в файле проекта:

      <ItemGroup>
        <SupportedPlatform Include="Solaris" />
      </ItemGroup>
    
    [SupportedOSPlatform("Solaris")] // No warning
    public void SolarisApi() { }
    
  • Исправьте недопустимую версию. Например, для Android10 не является допустимой версией, а 10.0 является.

    // Before
    [UnsupportedOSPlatform("Android10")] // Warns: Version '10' is not valid for platform 'Android'. Use a version with 2-4 parts for this platform.
    public void DoesNotWorkOnAndroid() { }
    
    // After
    [UnsupportedOSPlatform("Android10.0")] // No warning.
    public void DoesNotWorkOnAndroid() { }
    
  • Если платформа не поддерживает версию, удалите часть версии.

    // Before
    [SupportedOSPlatform("Linux4.8")] // Warns: Version '4.8' is not valid for platform 'Linux'. Do not use versions for this platform.
    public void LinuxApi() { }
    
    // After
    [SupportedOSPlatform("Linux")] // No warning.
    public void LinuxApi() { }
    

Когда лучше отключить предупреждения

Не рекомендуется использовать неизвестное имя платформы или недопустимую версию, поэтому не следует подавлять это правило.

См. также