この記事では、次のコンパイラ エラーについて説明します。
- CS0514: 静的コンストラクターは、明示的な 'this' または 'base' コンストラクターの呼び出しを持つことはできません。
- CS0515: アクセス修飾子は静的コンストラクターでは許可されません。
- CS0516: コンストラクター 'constructor' はそれ自体を呼び出できません。
- CS0517: 'class' には基底クラスがなく、基底コンストラクターを呼び出すことはできません。
- CS0522: 構造体は基底クラスのコンストラクターを呼び出すことができません。
- CS0526: インターフェイスにコンストラクターを含めることはできません。
- CS0568: 構造体に明示的なパラメーターなしのコンストラクターを含めることはできません。
- CS0710: 静的クラスにインスタンス コンストラクターを含めることはできません。
- CS0768: コンストラクターは、別のコンストラクターを介して自身を呼び出すことはできません。
- CS8054: 列挙型に明示的なパラメーターなしのコンストラクターを含めることはできません。
- CS8091: extern にすることはできず、コンストラクター初期化子を持つことはできません。
- CS8861: 予期しない引数リスト。
- CS8862: パラメーター リストを持つ型で宣言されたコンストラクターには、'this' コンストラクター初期化子が必要です。
- CS8358: 'in' パラメーターがあるため、属性コンストラクターを使用できません。
- CS8867: 基本型 '{0}' にアクセス可能なコピー コンストラクターが見つかりません。
- CS8868: レコード内のコピー コンストラクターは、ベースのコピー コンストラクターを呼び出す必要があります。レコードがオブジェクトから継承される場合は、パラメーターなしのオブジェクト コンストラクターを呼び出す必要があります。
- CS8878: コピー コンストラクター '{0}' は、レコードがシールされていないため、パブリックまたは保護されている必要があります。
- CS8910: プライマリ コンストラクターは、合成されたコピー コンストラクターと競合します。
- CS8958: パラメーターなしの構造体コンストラクターは 'public' である必要があります。
- CS8982: パラメーター リストを持つ 'struct' で宣言されたコンストラクターには、プライマリ コンストラクターまたは明示的に宣言されたコンストラクターを呼び出す 'this' 初期化子が必要です。
- CS8983: フィールド初期化子を持つ 'struct' には、明示的に宣言されたコンストラクターを含める必要があります。
- CS9105: このコンテキストでは、プライマリ コンストラクター パラメーターを使用できません。
- CS9106: 識別子は、このコンテキストの型とパラメーターの間であいまいです。
- CS9108: 匿名メソッド、ラムダ式、クエリ式、またはローカル関数内で ref のような型を持つパラメーターを使用できません。
-
CS9109: インスタンス メンバー内でプライマリ コンストラクター パラメーター
ref
、out
、またはin
を使用することはできません。 - CS9110: インスタンス メンバー内に ref のような型を持つプライマリ コンストラクター パラメーターを使用できません。
- CS9111: 構造体のインスタンス メンバー内の匿名メソッド、ラムダ式、クエリ式、およびローカル関数は、プライマリ コンストラクター パラメーターにアクセスできません。
- CS9112: 構造体内の匿名メソッド、ラムダ式、クエリ式、およびローカル関数は、インスタンス メンバー内でも使用されるプライマリ コンストラクター パラメーターにアクセスできません。
- CS9114: 読み取り専用型のプライマリ コンストラクター パラメーターを割り当てることはできません (型または変数初期化子の init 専用セッターを除く)。
- CS9115: 読み取り専用型のプライマリ コンストラクター パラメーターは、書き込み可能な参照では返すことができません。
- CS9116: 読み取り専用型のプライマリ コンストラクター パラメーターは、ref 値または out 値として使用できません (型または変数初期化子の init 専用セッターを除く)。
- CS9117: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは変更できません (型または変数初期化子の init 専用セッターを除く)。
- CS9118: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは、書き込み可能な参照によって返すことができません。
-
CS9119: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは、
ref
値またはout
値として使用できません (型または変数初期化子の init 専用セッターを除く)。 - CS9120: 参照によってプライマリ コンストラクター パラメーターを返すことはできません。
- CS9121: 型の構造体のプライマリ コンストラクター パラメーターにより、構造体レイアウトにサイクルが発生します。
- CS9122: 予期しないパラメーター リスト。
- CS9136: インスタンス メンバー内で型のプライマリ コンストラクター パラメーターを使用できません。
さらに、この記事では次の警告について説明します。
- CS0824: コンストラクター 'name' は外部としてマークされています。
- CS9107: パラメーターは外側の型の状態にキャプチャされ、その値も基本コンストラクターに渡されます。値は基底クラスによってもキャプチャされる場合があります。
- CS9113: パラメーターが未読です。
- CS9124: パラメーターは外側の型の状態にキャプチャされ、その値がフィールド、プロパティ、またはイベントの初期化に使用されます。
- CS9179: プライマリ コンストラクター パラメーターがベースのメンバーによってシャドウされる
静的コンストラクター
- CS0514: 静的コンストラクターは、明示的な 'this' または 'base' コンストラクターの呼び出しを持つことはできません。
- CS0515: 静的コンストラクターではアクセス修飾子を使用できません。
1 つの型に対して最大 1 つの静的コンストラクターを記述できます。 静的コンストラクターの宣言は、次の規則に従う必要があります。
- 静的コンストラクターには
static
修飾子がありますが、public
、protected
、private
、internal
などの他の修飾子はありません。 - 静的コンストラクターは、パラメーターなしのコンストラクターである必要があります。
- 静的コンストラクターは、
base()
またはthis()
を呼び出してはなりません。 基底クラスに静的コンストラクターが含まれている場合、ランタイムはそれを自動的に呼び出します。
コンストラクター宣言
- CS0526: インターフェイスにコンストラクターを含めることはできません。
- CS0710: 静的クラスにインスタンス コンストラクターを含めることはできません。
- CS8054: 列挙型に明示的なパラメーターなしのコンストラクターを含めることはできません。
- CS8358: 'in' パラメーターがあるため、属性コンストラクターを使用できません。
- CS8091: コンストラクターを extern にすることはできず、コンストラクター初期化子を持つことはできません。
コンストラクターは、class
型やstruct
型など、record class
型とrecord struct
型でのみ使用できます。
enum
型またはinterface
型では定義できません。 さらに、 属性 クラス型はパラメーター in
宣言できません。 代わりに、パラメーターを値渡しします。
extern
コンストラクターを宣言できますが、base()
またはthis()
コンストラクター呼び出しを使用して、extern
宣言されたコンストラクターから別のコンストラクターを呼び出すことはできません。
さらに、コンストラクター宣言に対して次の警告を生成できます。
- CS0824: コンストラクターはエクスターナルとしてマークされています。
コンストラクターが extern
マークされている場合、コンパイラはコンストラクターが存在するとは限りません。 したがって、コンパイラはこの警告を生成します。
構造体型のコンストラクター
- CS0568: 構造体に明示的なパラメーターなしのコンストラクターを含めることはできません。
- CS8958: パラメーターなしの構造体コンストラクターは 'public' である必要があります。
- CS8982: パラメーター リストを持つ 'struct' で宣言されたコンストラクターには、プライマリ コンストラクターまたは明示的に宣言されたコンストラクターを呼び出す 'this' 初期化子が必要です。
- CS8983: フィールド初期化子を持つ 'struct' には、明示的に宣言されたコンストラクターを含める必要があります。
C# の最近の機能により、 struct
型に対する以前の制限が削除されました。
CS0568 は、以前のバージョンの C# でパラメーターなしのインスタンス コンストラクターを宣言すると生成されます。 新しいバージョンの C# では、明示的なパラメーターなしのインスタンス コンストラクターを宣言できます。 その明示的なパラメーターなしのコンストラクターは public
する必要があります。
struct
でフィールド初期化子が宣言されている場合は、明示的なインスタンス コンストラクターも宣言する必要があります。 このコンストラクターは、ボディが空の引数なしコンストラクターにすることができます。
struct
型がrecord struct
型を含むプライマリ コンストラクターを宣言する場合、パラメーターなしのコンストラクターを除く他のすべてのインスタンス コンストラクターは、this()
を使用してプライマリ コンストラクターまたは別の明示的に宣言されたコンストラクターを呼び出す必要があります。
base
とthis
のコンストラクター呼び出し
- CS0516: コンストラクターはそれ自体を呼び出すことができません。
- CS0517: クラスには基底クラスがなく、基本コンストラクターを呼び出すことができません。
- CS0522: 構造体は基底クラスのコンストラクターを呼び出すことができません。
- CS0768: コンストラクターは、別のコンストラクターを介して自身を呼び出すことはできません。
base()
とthis()
を使用して、1 つのコンストラクターで同じ型または基本型で別のコンストラクターを呼び出すことができます。 コンストラクターを呼び出すと、重複するコンストラクター ロジックを最小限に抑えることができます。
this()
またはbase()
を使用して別のコンストラクターを呼び出すときは、次の規則に従う必要があります。
コンストラクターは、別のコンストラクターを介して直接または間接的に自身を呼び出すことはできません。 たとえば、次のコードは無効です。
public class C { public C() : this() // Error! { } } public class C2 { public class C2() : this(10) {} public class C2(int capacity) : this() { _capacity = capacity; } private int _capacity; } ``
構造体型は
base()
を呼び出すことはできません。 どちらも System.Objectできません。
レコードとコピーコンストラクター
- CS8867: 基本型にアクセス可能なコピー コンストラクターが見つかりません。
- CS8868: レコード内のコピー コンストラクターは、ベースのコピー コンストラクターを呼び出す必要があります。レコードがオブジェクトから継承される場合は、パラメーターなしのオブジェクト コンストラクターを呼び出す必要があります。
- CS8878: レコードがシールされていないため、コピー コンストラクターをパブリックまたは保護する必要があります。
- CS8910: プライマリ コンストラクターは、合成されたコピー コンストラクターと競合します。
record
型またはstruct
型にclass
修飾子を追加するとレコードが作成されます。 レコードには、コンパイラで合成された コピー コンストラクターが含まれます。 明示的なコピー コンストラクターは自分で記述できますが、次の規則に従う必要があります。
- コピー コンストラクターは、型が
public
されていない限り、protected
またはsealed
する必要があります。 - 基底クラスが
base()
されていない限り、コピー コンストラクターは System.Object コピー コンストラクターを呼び出す必要があります。 - さらに、基本型にはコピー コンストラクターが必要です。
record
型には常にコピー コンストラクターがあります。
プライマリ コンストラクター宣言
コンパイラは、プライマリ コンストラクターがクラスと構造体のプライマリ コンストラクターの 1 つ以上の規則に違反すると、次のエラーを出力します。
- CS8861: 予期しない引数リスト。
- CS8862: パラメーター リストを持つ型で宣言されたコンストラクターには、'this' コンストラクター初期化子が必要です。
- CS9105: このコンテキストでは、プライマリ コンストラクター パラメーターを使用できません。
- CS9106: 識別子は、このコンテキストの型とパラメーターの間であいまいです。
- CS9108: 匿名メソッド、ラムダ式、クエリ式、またはローカル関数内で ref のような型を持つパラメーターを使用できません。
-
CS9109: インスタンス メンバー内で
ref
、out
、またはプライマリ コンストラクター パラメーターin
使用できません。 - CS9110: インスタンス メンバー内に ref のような型を持つプライマリ コンストラクター パラメーターを使用できません。
- CS9111: 構造体のインスタンス メンバー内の匿名メソッド、ラムダ式、クエリ式、およびローカル関数は、プライマリ コンストラクター パラメーターにアクセスできません。
- CS9112: 構造体内の匿名メソッド、ラムダ式、クエリ式、およびローカル関数は、インスタンス メンバー内でも使用されるプライマリ コンストラクター パラメーターにアクセスできません。
- CS9114: 読み取り専用型のプライマリ コンストラクター パラメーターを割り当てることはできません (型または変数初期化子の init 専用セッターを除く)。
- CS9115: 読み取り専用型のプライマリ コンストラクター パラメーターは、書き込み可能な参照では返すことができません。
-
CS9116: 読み取り専用型のプライマリ コンストラクター パラメーターは、
ref
値またはout
値として使用できません (型または変数初期化子の init 専用セッターを除く)。 - CS9117: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは変更できません (型または変数初期化子の init 専用セッターを除く)。
- CS9118: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは、書き込み可能な参照によって返すことができません。
-
CS9119: 読み取り専用型のプライマリ コンストラクター パラメーターのメンバーは、
ref
値またはout
値として使用できません (型または変数初期化子の init 専用セッターを除く)。 - CS9120: 参照によってプライマリ コンストラクター パラメーターを返すことはできません。
- CS9121: 型の構造体のプライマリ コンストラクター パラメーターにより、構造体レイアウトにサイクルが発生します。
- CS9122: 予期しないパラメーター リスト。
- CS9124: パラメーターは外側の型の状態にキャプチャされ、その値はフィールド、プロパティ、またはイベントの初期化にも使用されます。
- CS9136: インスタンス メンバー内で型のプライマリ コンストラクター パラメーターを使用できません。
プライマリ コンストラクター パラメーターは、その型の本体のスコープ内にあります。 コンパイラは、メンバーまたはフィールド初期化子で使用するパラメーターを格納するフィールドを合成できます。 プライマリ コンストラクター パラメーターはフィールドにコピーされる可能性があるため、次の制限が適用されます。
- プライマリ コンストラクターは、
struct
型とclass
型で宣言できますが、interface
型では宣言できません。 - プライマリ コンストラクターのパラメーターは、プライマリ コンストラクターの一部として除き、
base()
コンストラクター呼び出しでは使用できません。 - ラムダ式、クエリ式、またはローカル関数では、
ref struct
型のプライマリ コンストラクター パラメーターにアクセスできません。 - 型が
ref struct
でない場合は、インスタンス メンバーref struct
パラメーターにアクセスできません。 -
ref struct
型では、in
、ref
、またはout
修飾子を持つプライマリ コンストラクター パラメーターは、インスタンス メソッドまたはプロパティ アクセサーでは使用できません。
構造体の型には、プライマリ コンストラクター パラメーターに次の追加の制限があります。
- プライマリ コンストラクター パラメーターは、ラムダ式、クエリ式、またはローカル関数ではキャプチャできません。
- プライマリ コンストラクターのパラメーターは参照で返すことはできません(
ref
またはreadonly ref
による返却)。
読み取り専用の構造体型には、プライマリ コンストラクター パラメーターに次の追加の制限があります。
- プライマリ コンストラクターパラメーターとそのメンバーは、
readonly
構造体で再割り当てできません。 - プライマリ コンストラクターパラメーターとそのメンバーは、
ref
構造体でreadonly
返すことはできません。 - プライマリ コンストラクターのパラメーターとそのメンバーは、どのメソッドにも
ref
またはout
引数にすることはできません。
いずれの場合も、プライマリ コンストラクター パラメーターの制限は、これらの型のデータ フィールドに対する制限と一致します。 この制限は、プライマリ コンストラクター パラメーターが型内の合成フィールドに変換される可能性があるためです。 したがって、プライマリ コンストラクター パラメーターは、その合成フィールドに適用される規則に従う必要があります。
派生プライマリ コンストラクターは、基本コンストラクターにパラメーターを指定して、基本プライマリ コンストラクターを呼び出します。 派生コンストラクター宣言のパラメーター名を使用する必要があります。
この警告は、キャプチャまたはシャドウされたプライマリ コンストラクター パラメーターに関するガイダンスを提供します。
- CS9107: パラメーターは外側の型の状態にキャプチャされ、その値も基本コンストラクターに渡されます。値は基底クラスによってもキャプチャされる場合があります。 この警告は、コードにプライマリ コンストラクター パラメーターの 2 つのコピーが割り当てられている可能性があることを示します。 パラメーターは基底クラスに渡されるため、基底クラスで使用される可能性があります。 派生クラスはそれにアクセスするため、同じパラメーターの 2 番目のコピーを持つことができます。 その余分なストレージは意図されていない可能性があります。
- CS9113: パラメーターが未読です。 この警告は、基底プライマリ コンストラクターに渡す場合でも、クラスがプライマリ コンストラクターを参照しないことを示します。 これは必要ない可能性があります。
- CS9124: パラメーターは外側の型の状態にキャプチャされ、その値はフィールド、プロパティ、またはイベントの初期化にも使用されます。 この警告は、入れ子になった型のコンストラクター パラメーターも外側の型によってキャプチャされることを示します。 パラメーターは 2 回格納される可能性があります。
- CS9179: プライマリ コンストラクター パラメーターがベースのメンバーによってシャドウされる
.NET