CA1418: Validación de la compatibilidad con las plataformas

Propiedad Value
Identificador de la regla CA1418
Título Validación de la compatibilidad con las plataformas
Categoría Interoperabilidad
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como advertencia

Causa

El analizador de compatibilidad de plataformas requiere un nombre y una versión de plataforma válidos. Se notifican infracciones si la cadena de plataforma proporcionada al constructor OSPlatformAttribute consta de un nombre de plataforma desconocido o si el elemento de versión opcional no es válido.

Descripción de la regla

Los atributos de compatibilidad de plataforma derivados de OSPlatformAttribute usan literales de cadena para los nombres de plataforma del sistema operativo (SO) con un elemento de versión opcional. La cadena debe constar de un nombre de plataforma conocido y ningún elemento de versión o un elemento de versión válido.

La lista de nombres de plataforma conocidos se rellena desde dos lugares:

  • El elemento PlatformName de los métodos de restricción OperatingSystem denominados OperatingSystem.Is<PlatformName>[VersionAtLeast](). Por ejemplo, el método de restricción OperatingSystem.IsWindows() agrega Windows a la lista de nombres de plataforma conocidos.

  • El grupo de elementos MSBuild del proyecto de SupportedPlatform elementos, incluida la lista MSBuild SupportedPlatforms predeterminada. Este es el conocimiento específico del proyecto de las plataformas conocidas. Permite a los autores de bibliotecas de clases agregar más plataformas a la lista de plataformas conocidas. Por ejemplo:

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

Si la cadena de plataforma contiene un elemento de versión, debe ser un elemento Version válido con el formato siguiente: major.minor[.build[.revision]].

Infracciones

  • Solaris es un nombre de plataforma desconocido porque no se incluye en la lista MSBuild SupportedPlatforms predeterminada y no hay ningún método de restricción denominado OperatingSystem.IsSolaris() en la clase OperatingSystem.

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • Android es una plataforma conocida porque hay un método de restricción OperatingSystem.IsAndroid() en el tipo OperatingSystem. Sin embargo, el elemento de versión no es una versión válida. Debe tener al menos dos enteros separados por un punto.

    [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 es una plataforma conocida porque se incluye en la lista MSBuild SupportedPlatforms predeterminada y, además, hay un método de restricción denominado OperatingSystem.IsLinux(). Sin embargo, no hay ningún método de restricción con versiones como System.OperatingSystem.IsLinuxVersionAtLeast(int,int) para la plataforma Linux, por lo que no se admite ningún elemento de versión en Linux.

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

Cómo corregir infracciones

  • Cambie la plataforma a un nombre de plataforma conocido.

  • Si el nombre de plataforma es correcto y quiere convertirlo en una plataforma conocida, agréguelo a la lista MSBuild SupportedPlatforms del archivo del proyecto:

      <ItemGroup>
        <SupportedPlatform Include="Solaris" />
      </ItemGroup>
    
    [SupportedOSPlatform("Solaris")] // No warning
    public void SolarisApi() { }
    
  • Corrija la versión no válida. Por ejemplo, para Android, 10 no es una versión válida, pero 10.0 es válida.

    // 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() { }
    
  • Si la plataforma no admite una versión, quite el elemento de versión.

    // 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() { }
    

Cuándo suprimir las advertencias

No se recomienda usar un nombre de plataforma desconocido o una versión no válida, por lo que no debe suprimir esta regla.

Consulte también