共用体の型または閉じた型階層を誤用すると、C# コンパイラによってエラーが生成されます。 共用体型は、暗黙的な変換と完全なパターン マッチングを使用して、複数の ケース型のいずれかを指定できる値を表します。 閉じた階層では、基本型から派生できる型が制限されます。 これらの診断は、共用体の型と閉じた階層を宣言して使用するための規則に従うのに役立ちます。
- CS9370: 共用体宣言では、少なくとも 1 つのケース型を指定する必要があります。
- CS9371: 暗黙的な参照またはボックス化変換を使用して型 'type' を 'object' に変換できません。
- CS9373: インスタンス フィールド、自動プロパティ、またはフィールドに似たイベントは、'union' 宣言では許可されません。
- CS9374: 1 つのパラメーターを持つ明示的に宣言されたパブリック コンストラクターは、'union' 宣言では許可されません。
- CS9375: 'union' 宣言で宣言されたコンストラクターには、合成コンストラクターまたは明示的に宣言されたコンストラクターを呼び出す 'this' 初期化子が必要です。
- CS9380: 型とエイリアスに 'closed' という名前を付けることはできません。
- CS9381: 'type': 閉じた型をシールまたは静的にすることはできません
- CS9382: 'type': 別のアセンブリの閉じた型 'type' を基本型として使用することはできません。
- CS9383: 'type': 基本型が閉じているため、基本型 'type' で型パラメーター 'parameter' を参照する必要があります。
- CS9384: 'type': 閉じた型は、常に暗黙的に抽象であるため、抽象型としてマークすることはできません。
- CS9385: 共用体の型には、少なくとも 1 つの共用体作成メンバーが必要です。
- CS9386: 共用体メンバーのプロバイダー型には、型が 'object?' または 'object' であるインスタンス 'Value' プロパティが必要です。そのプロパティには public の get アクセサーが必要です。
- CS9387: 'union' 宣言では、共用体メンバー プロバイダー インターフェイスを使用できません。
共用体宣言の要件
- CS9370: 共用体宣言では、少なくとも 1 つのケース型を指定する必要があります。
- CS9371: 暗黙的な参照またはボックス化変換を使用して型 'type' を 'object' に変換できません。
共用体宣言では、名前とケースの種類の一覧を指定します。 これらのエラーは、有効な共用体宣言の構造上の要件を強制するものです。 完全なルールについては、 共用体の種類の特徴の仕様を参照してください。
これらのエラーを修正するには、共用体宣言に次の変更を適用してください。
- 共用体の型リストに少なくとも 1 つのケース型を追加します (CS9370)。 共用体の目的は、クローズされた代替セットを表すので、共用体には 1 つ以上のケース・タイプが必要です。 ケース型のない
union Empty()のような宣言は意味がありません。 - 暗黙的な参照またはボックス化変換 (
object) を使用してに変換されないケースの種類を変更または削除します。 共用体の型はその内容を単一のobject?参照として保持するため、すべてのケース型はobjectに変換できる必要があります。 ポインターやref struct型などの型は、この要件を満たしていません。 それらをボックス化したり、参照として格納したりできるラッパータイプに置き換えます。
共用体メンバーの制限
- CS9373: インスタンス フィールド、自動プロパティ、またはフィールドに似たイベントは、'union' 宣言では許可されません。
- CS9374: 1 つのパラメーターを持つ明示的に宣言されたパブリック コンストラクターは、'union' 宣言では許可されません。
- CS9375: 'union' 宣言で宣言されたコンストラクターには、合成コンストラクターまたは明示的に宣言されたコンストラクターを呼び出す 'this' 初期化子が必要です。
共用体宣言には、追加のメンバーを含む本文を含めることができますが、コンパイラは宣言できる内容を制限します。 これらの制限により、コンパイラによって生成された変換コンストラクターとストレージ メカニズムが正しく機能します。 完全なルールについては、 共用体の種類の特徴の仕様を参照してください。
これらのエラーを修正するには、共用体メンバーに次の変更を適用します。
- インスタンス フィールド、自動実装プロパティ、フィールドに似たイベントを共用体 (CS9373) から削除します。 共用体では、新しいデータ メンバーは定義されません。 既存の型は、閉じた代替セットに構成されます。 追加の状態は、ケース型そのものの中で宣言するか、または共用体の静的メンバーとして使用します。
- 1 つのパラメーター (CS9374) を受け取る明示的に宣言されたパブリック コンストラクターのアクセシビリティを削除または変更します。 コンパイラは、暗黙的な共用体変換をサポートするために、ケースの種類ごとにパブリック単一パラメーター コンストラクターを生成します。 同じ図形を持つ明示的なコンストラクターは、生成されたコンストラクターと競合します。 単一パラメーター コンストラクターが必要な場合は、
internalまたはprivateにします。 -
this初期化子を明示的に宣言されたコンストラクターに追加して、合成コンストラクターまたは別の明示的に宣言されたコンストラクター (CS9375) にチェーンできるようにします。 コンパイラによって生成されたコンストラクターは、共用体の内部ストレージを正しく初期化します。 これらを経由せずにチェーン処理を行わないコンストラクターは、共用体を無効な状態にしてしまう可能性があります。 生成されたケース型コンストラクターにチェーンするには: this(someValue)を使用し、あなたが宣言する明示的なパラメーターなしのコンストラクターにチェーンするには: this()を使用します。
共用体メンバーのプロバイダー要件
- CS9385: 共用体型には、少なくとも 1 つの共用体生成メンバーが含まれている必要があります。
- CS9386: 共用体メンバーのプロバイダー型には、型が「object?」または「object」のインスタンス「Value」プロパティが必須です。このプロパティには、パブリックの get アクセサーが必須です。。
- CS9387: 「共用体」宣言では、共用体のメンバープロバイダー インターフェースを使用できません。
共用体メンバー プロバイダーは、 union キーワードではなく、インターフェイスを介して共用体パターンを実装する型です。 これらのエラーは、共用体メンバー プロバイダー パターンに参加する型に対する構造上の要件を強制するものです。 完全なルールについては、 共用体の種類の特徴の仕様を参照してください。
これらのエラーを修正するには、共用体メンバー プロバイダーに次の変更を適用します。
- 1 つ以上の共用体作成メンバーを型に追加します (CS9385)。 共用体の型は、ケース型から共用体の値を構築できるように、少なくとも 1 つの作成メンバー (静的ファクトリ メソッドや暗黙的な変換など) を公開する必要があります。
- メンバー プロバイダー型に、型が
object?またはobjectで、publicgetアクセサーを持つ public インスタンスValueプロパティを追加します (CS9386)。Valueプロパティは、ランタイムが共用体から格納された値を取得する方法です。 これを使用しないと、共用体はパターン マッチングや直接アクセスのためにその内容を公開できません。 -
union宣言から共用体メンバー プロバイダー インターフェースを削除します (CS9387)。union宣言は、独自のメンバー プロバイダー実装を合成します。unionキーワードを直接使用する型では、共用体メンバー プロバイダー インターフェイスを指定できません。 メンバー プロバイダー インターフェイスは、共用体パターンを手動で実装する型でのみ使用します。
閉じた階層構造の制約
-
CS9380: 型とエイリアスに
closed名前を付けることはできません。 - CS9381: 'type': 閉じた型をシールまたは静的にすることはできません
- CS9382: 'type': 別のアセンブリの閉じた型 'type' を基本型として使用できません。
- CS9383: 'type': 基本型が閉じているため、基本型 'type' で型パラメーター 'parameter' を参照する必要があります。
- CS9384: 'type': 閉じた型は、常に暗黙的に抽象であるため、抽象型としてマークすることはできません。
閉じた型階層では、基本型から派生できる型が制限されます。 コンパイラは、これらの制限を適用して、派生型のセットが既知かつ完全であることを確認します。 完全なルールについては、 閉じた階層機能の仕様を参照してください。
これらのエラーを修正するには、閉じた階層宣言に次の変更を適用します。
-
closedという名前の型または別名は、このコンテキストではclosedが予約語であるため、名前を変更してください(CS9380)。 キーワードと競合しない別の名前を選択します。 - 閉じた型 (
sealed) からstaticまたは修飾子を削除します。 閉じた型は暗黙的に抽象型 (派生元である必要があります) であるため、マークsealed(派生を妨げる) またはstatic(インスタンス化と派生を妨げる) は、その目的と矛盾します。 - 別のアセンブリ (CS9382) で宣言された閉じた型から派生しないでください。 閉じた階層には、基本型と同じアセンブリで定義されているすべてのサブタイプが必要です。 この制限により、コンパイラは完全なパターン マッチングを実行できます。 派生型を閉じた基本型と同じアセンブリに移動するか、継承リレーションシップを削除します。
- 基本型が閉じているときに、ジェネリック サブタイプの各型パラメーターが基本型参照に表示されることを確認します (CS9383)。 閉じた階層にはすべてのサブタイプに関する完全な知識が必要であるため、サブタイプのすべての型パラメーターは、基本型を使用して制約する必要があります。 型パラメーターが基本型で参照されていない場合、コンパイラは考えられるすべてのインスタンス化を列挙できません。
- 閉じた型宣言 (
abstract) から修飾子を削除します。 閉じた型は、有限の派生型のベースとして機能するため、常に暗黙的に抽象化されます。abstract明示的に追加することは冗長であり、型が他の閉じた型とは異なるセマンティクスを持っているかどうかについての混乱を避けるために許可されていません。
.NET