CA1418: проверка совместимости платформ
Свойство | Значение |
---|---|
Идентификатор правила | CA1418 |
Заголовок | Проверка совместимости платформ |
Категория | Совместимость |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | Как предупреждение |
Причина
Анализатор совместимости платформ требует указать действительное имя и версию платформы. О нарушениях сообщается, если строка платформы, предоставленная конструктору 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() { }
Исправьте недопустимую версию. Например, для
Android
10
не является допустимой версией, а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() { }
Когда лучше отключить предупреждения
Не рекомендуется использовать неизвестное имя платформы или недопустимую версию, поэтому не следует подавлять это правило.