CA1418: プラットフォームの互換性を検証する

プロパティ
ルール ID CA1418
Title プラットフォームの互換性を検証する
[カテゴリ] 相互運用性
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 警告として

原因

プラットフォーム互換性アナライザーには、有効なプラットフォーム名とバージョンが必要です。 OSPlatformAttribute コンストラクターに提供されたプラットフォーム文字列が不明なプラットフォーム名で構成されいる場合、または省略可能なバージョン部分が無効である場合は、違反が報告されます。

規則の説明

OSPlatformAttribute から派生したプラットフォーム互換性属性には、オペレーティング システム (OS) のプラットフォーム名に省略可能なバージョン部分を含む文字列リテラルが使用されます。 この文字列は、既知のプラットフォーム名と、バージョン部分がないか、有効なバージョン部分のいずれかで構成されている必要があります。

既知のプラットフォーム名の一覧は、次の 2 つの場所から入力されます。

  • OperatingSystem.Is<PlatformName>[VersionAtLeast]() という名前の OperatingSystem ガード メソッドの PlatformName 部分。 たとえば、ガード メソッド OperatingSystem.IsWindows() により、Windows は既知のプラットフォーム名一覧に追加されます。

  • 既定の MSBuild SupportedPlatforms 一覧を含む SupportedPlatform 項目のプロジェクトの MSBuild 項目グループ。 これは、既知のプラットフォームに関するプロジェクト固有の情報です。 これにより、クラス ライブラリ作成者は、既知のプラットフォーム一覧にさらにプラットフォームを追加することができます。 次に例を示します。

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

プラットフォーム文字列に "バージョン" の部分が含まれている場合は、major.minor[.build[.revision]] の形式の有効な Version である必要があります。

違反

  • Solaris不明なプラットフォーム名です。これは、既定の MSBuild SupportedPlatforms 一覧に含まれておらず、OperatingSystem クラスに OperatingSystem.IsSolaris() という名前のガード メソッドが存在しないためです。

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • Android は、OperatingSystem 型に OperatingSystem.IsAndroid() ガード メソッドがあるので、既知のプラットフォームです。 ただし、バージョンの部分は有効なバージョンではありません。 ドットで区切られた 2 つ以上の整数が必要です。

    [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() という名前のガード メソッドも存在するので、既知のプラットフォームです。 ただし、Linux プラットフォームには System.OperatingSystem.IsLinuxVersionAtLeast(int,int) のようなバージョン管理されたガード メソッドが存在しないため、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() { }
    

どのようなときに警告を抑制するか

不明なプラットフォーム名または無効なバージョンを使用することは推奨されないため、この規則を抑制しないでください。

関連項目