CA1028: 列挙ストレージは Int32 でなければなりません

プロパティ
ルール ID CA1028
Title 列挙ストレージは Int32 でなければなりません
[カテゴリ] デザイン
修正が中断ありか中断なしか あり
.NET 8 では既定で有効 いいえ

原因

列挙型の基になる型が System.Int32 ではありません。

デフォルトでは、この規則の対象は外部から参照できる列挙型のみですが、これは構成可能です。

規則の説明

列挙型は、関連する名前付き定数が複数定義された値型です。 既定で、System.Int32 データ型は、定数値を格納するために使用されます。 この基になる型を変更できる場合でも、ほとんどの場合、変更する必要はなく、推奨もされません。 Int32 より小さいデータ型を使用すると、パフォーマンスが大幅に向上することはありません。 既定のデータ型を使用できない場合、列挙型のすべての値を共通言語システム (CLS) 準拠のプログラミング言語で表現できるよう、CLS 準拠の整数型 ByteInt16Int32Int64 のいずれかを使用してください。

違反の修正方法

この規則違反を修正するには、サイズまたは互換性の問題が存在しない限り、Int32 を使用します。 Int32 では値を保持するには十分な大きさでない場合、Int64 を使用します。 下位互換性でデータ型をもっと小さいものにする必要がある場合、Byte または Int16 を使用します。

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

下位互換性問題で必要になる場合のみ、この規則からの警告を非表示にします。 アプリケーションでは、この規則に準拠しないと、通常、問題が発生します。 言語の相互運用性が要求されるライブラリでは、この規則に準拠できないと、ユーザーに悪影響を与えることがあります。

警告を抑制する

単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。

#pragma warning disable CA1028
// The code that's violating the rule is on this line.
#pragma warning restore CA1028

ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none に設定します。

[*.{cs,vb}]
dotnet_diagnostic.CA1028.severity = none

詳細については、「コード分析の警告を抑制する方法」を参照してください。

分析するコードを構成する

次のオプションを使用して、コードベースのどの部分に対してこの規則を実行するか構成します。

このオプションを構成できる対象は、この規則だけ、それを適用するすべての規則、それを適用するこのカテゴリ (デザイン) のすべての規則のいずれかです。 詳細については、「コード品質規則の構成オプション」を参照してください。

特定の API サーフェイスを含める

ユーザー補助に基づいて、この規則を実行するコードベースの部分を構成できます。 たとえば、非パブリック API サーフェイスでのみ規則を実行するように指定するには、プロジェクトの .editorconfig ファイルに次のキーと値のペアを追加します。

dotnet_code_quality.CAXXXX.api_surface = private, internal

次の例からは、推奨されている基礎データ型を使用しない 2 つの列挙型を確認できます。

[Flags]
public enum Days : uint
{
    None = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    All = Monday | Tuesday | Wednesday | Thursday | Friday
}

public enum Color : sbyte
{
    None = 0,
    Red = 1,
    Orange = 3,
    Yellow = 4
}
<Flags()>
Public Enum Days As UInteger
    None = 0
    Monday = 1
    Tuesday = 2
    Wednesday = 4
    Thursday = 8
    Friday = 16
    All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday
End Enum

Public Enum Color As SByte
    None = 0
    Red = 1
    Orange = 3
    Yellow = 4
End Enum

次の例では、基になるデータ型を Int32 に変更することで前の違反を修正しています。

[Flags]
public enum Days : int
{
    None = 0,
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    All = Monday | Tuesday | Wednesday | Thursday | Friday
}

public enum Color : int
{
    None = 0,
    Red = 1,
    Orange = 3,
    Yellow = 4
}
<Flags()>
Public Enum Days As Integer
    None = 0
    Monday = 1
    Tuesday = 2
    Wednesday = 4
    Thursday = 8
    Friday = 16
    All = Monday Or Tuesday Or Wednesday Or Thursday Or Friday
End Enum

Public Enum Color As Integer
    None = 0
    Red = 1
    Orange = 3
    Yellow = 4
End Enum

関連項目