次の方法で共有


コンストラクター宣言のエラーと警告を解決する

この記事では、次のコンパイラ エラーについて説明します。

  • 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: インスタンス メンバー内でプライマリ コンストラクター パラメーター refout、または 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 修飾子がありますが、 publicprotectedprivateinternalなどの他の修飾子はありません。
  • 静的コンストラクターは、パラメーターなしのコンストラクターである必要があります。
  • 静的コンストラクターは、 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()を使用してプライマリ コンストラクターまたは別の明示的に宣言されたコンストラクターを呼び出す必要があります。

basethisのコンストラクター呼び出し

  • 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: インスタンス メンバー内で refout、またはプライマリ コンストラクター パラメーター 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型では、inref、またはout修飾子を持つプライマリ コンストラクター パラメーターは、インスタンス メソッドまたはプロパティ アクセサーでは使用できません。

構造体の型には、プライマリ コンストラクター パラメーターに次の追加の制限があります。

  • プライマリ コンストラクター パラメーターは、ラムダ式、クエリ式、またはローカル関数ではキャプチャできません。
  • プライマリ コンストラクターのパラメーターは参照で返すことはできません(refまたはreadonly refによる返却)。

読み取り専用の構造体型には、プライマリ コンストラクター パラメーターに次の追加の制限があります。

  • プライマリ コンストラクターパラメーターとそのメンバーは、 readonly 構造体で再割り当てできません。
  • プライマリ コンストラクターパラメーターとそのメンバーは、ref構造体でreadonly返すことはできません。
  • プライマリ コンストラクターのパラメーターとそのメンバーは、どのメソッドにも ref または out 引数にすることはできません。

いずれの場合も、プライマリ コンストラクター パラメーターの制限は、これらの型のデータ フィールドに対する制限と一致します。 この制限は、プライマリ コンストラクター パラメーターが型内の合成フィールドに変換される可能性があるためです。 したがって、プライマリ コンストラクター パラメーターは、その合成フィールドに適用される規則に従う必要があります。

派生プライマリ コンストラクターは、基本コンストラクターにパラメーターを指定して、基本プライマリ コンストラクターを呼び出します。 派生コンストラクター宣言のパラメーター名を使用する必要があります。

この警告は、キャプチャまたはシャドウされたプライマリ コンストラクター パラメーターに関するガイダンスを提供します。

  • CS9107: パラメーターは外側の型の状態にキャプチャされ、その値も基本コンストラクターに渡されます。値は基底クラスによってもキャプチャされる場合があります。 この警告は、コードにプライマリ コンストラクター パラメーターの 2 つのコピーが割り当てられている可能性があることを示します。 パラメーターは基底クラスに渡されるため、基底クラスで使用される可能性があります。 派生クラスはそれにアクセスするため、同じパラメーターの 2 番目のコピーを持つことができます。 その余分なストレージは意図されていない可能性があります。
  • CS9113: パラメーターが未読です。 この警告は、基底プライマリ コンストラクターに渡す場合でも、クラスがプライマリ コンストラクターを参照しないことを示します。 これは必要ない可能性があります。
  • CS9124: パラメーターは外側の型の状態にキャプチャされ、その値はフィールド、プロパティ、またはイベントの初期化にも使用されます。 この警告は、入れ子になった型のコンストラクター パラメーターも外側の型によってキャプチャされることを示します。 パラメーターは 2 回格納される可能性があります。
  • CS9179: プライマリ コンストラクター パラメーターがベースのメンバーによってシャドウされる