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() { }
どのようなときに警告を抑制するか
不明なプラットフォーム名または無効なバージョンを使用することは推奨されないため、この規則を抑制しないでください。
関連項目
.NET