ジェネリック型パラメーターとジェネリック型引数に関連するエラーと警告を解決する

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

  • CS0080: 非ジェネリック宣言では制約を使用できません。
  • CS0081: 型パラメーター宣言は、型ではなく識別子である必要があります。
  • CS0224: vararg を持つメソッドは、ジェネリックにすることも、ジェネリック型にすることも、params パラメーターを持つことはできません。
  • CS0304: new()制約がないため、変数型のインスタンスを作成できません。
  • CS0305: ジェネリック型を使用するには、N 個の型引数が必要です。
  • CS0306: 型を型引数として使用することはできません。
  • CS0307: 'identifier' は型引数と共に使用できません。
  • CS0308: 非ジェネリック型または非ジェネリック メソッドを型引数と共に使用することはできません。
  • CS0310: ジェネリック型またはメソッドでパラメーターとして使用するには、パブリック パラメーターなしのコンストラクターを持つ非抽象型である必要があります。
  • CS0311: ジェネリック型またはメソッドで型パラメーター T として型を使用することはできません。'type1' から 'type2' への暗黙的な参照変換はありません。
  • CS0312: 型 'type1' は、ジェネリック型またはメソッドの型パラメーターとして使用できません。NULL 許容型 'type1' は 'constraint' の制約を満たしていません。
  • CS0313: 型 'type1' は、ジェネリック型またはメソッドの型パラメーターとして使用できません。null 許容型 'type1' が 'constraint' の制約を満たしていません。Null 許容型は、どのインターフェイス制約も満たできません。
  • CS0314: ジェネリック型またはメソッドで型パラメーターとして型を使用することはできません。'type' から 'constraint' へのボックス化変換または型パラメーター変換はありません。
  • CS0315: ジェネリック型またはメソッドで型パラメーター T として型を使用することはできません。'type' から 'constraint' へのボックス化変換はありません。
  • CS0401: new()制約は、指定された最後の制限制約である必要があります。
  • CS0403: null 非許容値型である可能性があるため、null を型パラメーターに変換できません。代わりに default(T) を使用することを検討してください。
  • CS0405: 型パラメーターの制約が重複しています。
  • CS0406: クラス型制約 'constraint' は、他の制約の前に存在する必要があります。
  • CS0409: 型パラメーター 'type parameter' に制約句が既に指定されています。型パラメーターのすべての制約は、1 つの where 句で指定する必要があります。
  • CS0411: メソッド 'method' の型引数は、使用法から推論できません。型引数を明示的に指定してみてください。
  • CS0412: パラメーター: パラメーター、ローカル変数、またはローカル関数は、メソッド型パラメーターと同じ名前を持つことはできません。
  • CS0413: クラス型制約もas制約もないため、型パラメーターを class 演算子と共に使用することはできません。
  • CS0417: 識別子: 変数型のインスタンスを作成するときに引数を指定できません。
  • CS0449: classstructunmanagednotnull、およびdefaultの制約を結合または複製することはできません。また、制約リストで最初に指定する必要があります。
  • CS0450: 型パラメーター: 制約クラスと class 制約または struct 制約の両方を指定できません。
  • CS0451: new()制約をstruct制約と共に使用することはできません。
  • CS0452: 型 'type name' をジェネリック型またはメソッド 'generic' のパラメーター 'parameter name' として使用するには、参照型でなければなりません。
  • CS0453: ジェネリック 型またはメソッド 'generic' でパラメーター 'parameter name' として使用するには、型 'type name' が null 非許容値型である必要があります。
  • CS0454: 型パラメーター 1 と型パラメーター 2 に関連する循環制約の依存関係。
  • CS0455: 型パラメーターは、競合する制約 'constraint1' と 'constraint2' を継承します。
  • CS0456: 型パラメーター '型パラメーター 1' には 'struct' 制約があるため、'型パラメーター 1' は '型パラメーター 2' の制約として使用できません。
  • CS0693: 型パラメーター 'type parameter' の名前は、外部型 'type' の型パラメーターと同じです。
  • CS0694: 型パラメーターの名前は、含まれている型またはメソッドと同じです。
  • CS0695: 'type' は'interface1' と 'interface2' の両方を実装できません。これは、一部の型パラメーターの置換で統一される可能性があるためです。
  • CS0698: ジェネリック型は属性クラスであるため、型から派生できません。
  • CS0699: 'generic' は型パラメーター 'identifier' を定義しません。
  • CS0701: 'identifier' は有効な制約ではありません。制約として使用される型は、インターフェイス、非シール クラス、または型パラメーターである必要があります。
  • CS0702: 制約を特殊クラスにすることはできません。
  • CS0703: アクセシビリティに一貫性がありません:制約の型は宣言よりもアクセシビリティが低くなります。
  • CS0704: 'type' の仮想メンバー以外の参照は、型パラメーターであるため実行できません。
  • CS0706: 制約の種類が無効です。制約として使用される型は、インターフェイス、非シール クラス、または型パラメーターである必要があります。
  • CS0717: 静的クラス: 静的クラスを制約として使用することはできません。
  • CS0718: 'type': 静的型は型引数として使用できません。
  • CS1720: 'ジェネリック型' の既定値が null であるため、式によって常に System.NullReferenceException が発生します。
  • CS1763: 'parameter' は型 'type' です。文字列以外の参照型の既定のパラメーター値は、null でのみ初期化できます。
  • CS1948: 範囲変数 'name' は、メソッド型パラメーターと同じ名前を持つことはできません。
  • CS1960: 無効な分散修飾子。バリアント型として指定できるのは、インターフェイスとデリゲート型のパラメーターのみです。
  • CS1961: 無効な分散: 型パラメーターは、'type' で共変に有効である必要があります。'type parameter' は反変です。
  • CS3024: 制約型 'type' は CLS に準拠していません。
  • CS7002: ジェネリック名の予期しない使用。
  • CS8322: 動的型の引数を、推論された型引数を持つジェネリック ローカル関数に渡すことはできません。
  • CS8375: 'new()' 制約を 'unmanaged' 制約と共に使用することはできません。
  • CS8377: ジェネリック型またはメソッド 'generic' でパラメーター 'parameter' として使用するには、型 'type' は、入れ子のどのレベルにあるすべてのフィールドも含めて、null 非許容の値型である必要があります。
  • CS8379: 型パラメーター '型パラメーター 1' には 'アンマネージ' 制約があるため、'型パラメーター 1' は '型パラメーター 2' の制約として使用できません。
  • CS8380: 'type': 制約クラスと 'アンマネージ' 制約の両方を指定できません。
  • CS8387: 型パラメーター 'type parameter' は、外部メソッド 'method' の型パラメーターと同じ名前です。
  • CS8389: 現在のコンテキストでは、型引数を省略することはできません。
  • CS8427: 列挙型、クラス、および構造体は、'in' または 'out' 型パラメーターを持つインターフェイスでは宣言できません。
  • CS8665: メソッド 'method' は型パラメーター 'type parameter' の 'class' 制約を指定しますが、オーバーライドまたは明示的に実装されたメソッド 'method' の対応する型パラメーター 'type parameter' は参照型ではありません。
  • CS8666: メソッド 'method' は型パラメーター 'type parameter' の 'struct' 制約を指定しますが、オーバーライドまたは明示的に実装されたメソッド 'method' の対応する型パラメーター 'type parameter' は null 非許容値型ではありません。
  • CS8822: メソッド 'method' は型パラメーター 'type parameter' の 'default' 制約を指定しますが、オーバーライドまたは明示的に実装されたメソッド 'method' の対応する型パラメーター 'type parameter' は、参照型または値型に制限されます。
  • CS8823: 'default' 制約は、オーバーライドおよび明示的なインターフェイス実装メソッドでのみ有効です。
  • CS8893: 'type' は'UnmanagedCallersOnly' の有効な呼び出し規則型ではありません。
  • CS8894: 'UnmanagedCallersOnly' に属性付きメソッドのパラメーターまたは戻り値の型として 'type' を使用できません。
  • CS8895: 'UnmanagedCallersOnly' で属性付けされたメソッドはジェネリック型パラメーターを持つことができず、ジェネリック型で宣言できません。
  • CS8896: 'UnmanagedCallersOnly' は、通常の静的な非抽象メソッド、非仮想メソッド、または静的ローカル関数にのみ適用できます。
  • CS9011: キーワード delegate は制約として使用できません。 System.Delegateを意味しましたか?
  • CS9012: 予期しないキーワード recordrecord struct または record classを意味しましたか?
  • CS9338: 一貫性のないアクセシビリティ: 型はクラスよりもアクセスできません。

型パラメーターの宣言と名前付け

  • CS0080: 非ジェネリック宣言では制約を使用できません。
  • CS0081: 型パラメーター宣言は、型ではなく識別子である必要があります。
  • CS0412: パラメーター: パラメーター、ローカル変数、またはローカル関数は、メソッド型パラメーターと同じ名前を持つことはできません。
  • CS0693: 型パラメーター 'type parameter' の名前は、外部型 'type' の型パラメーターと同じです。
  • CS0694: 型パラメーターの名前は、含まれている型またはメソッドと同じです。
  • CS0699: 'generic' は型パラメーター 'identifier' を定義しません。
  • CS1948: 範囲変数 'name' は、メソッド型パラメーターと同じ名前を持つことはできません。
  • CS8387: 型パラメーター 'type parameter' は、外部メソッド 'method' の型パラメーターと同じ名前です。
  • CS9012: 予期しないキーワード recordrecord struct または record classを意味しましたか?

これらのエラーは、ジェネリック型とメソッドで型パラメーターを宣言して名前を付ける方法に関連しています。 型パラメーター名は有効な識別子である必要があり、スコープ内の他の識別子と競合しないようにし、宣言の型パラメーター リストに含める必要があります。

  • 非ジェネリック宣言 (CS0080) から制約句を削除します。 where句は、型パラメーターを宣言するジェネリック型とメソッドでのみ使用できます。 制約を適用する必要がある場合は、最初に型またはメソッドの宣言に型パラメーターを追加します。
  • 実際の型名を型パラメーター宣言の識別子に置き換えます (CS0081)。 具象型 (TTKeyなど) ではなく、識別子 (TValueintstringなど) を使用して型パラメーターを宣言する必要があります。 型パラメーターの目的は、ジェネリック型またはメソッドを使用するときに、コンパイラが実際の型に置き換えるプレースホルダーとして機能することです。
  • 名前の競合を回避するために、型パラメーター、ローカル変数、パラメーター、または範囲変数の名前を変更します (CS0412CS0694CS1948)。 型パラメーター名は、同じスコープ内の識別子をシャドウすることはできません。また、含まれている型またはメソッドの名前と一致することはできません。 LINQ 範囲変数では、メソッドの型パラメーター名を再利用することもできません。 このような競合により、どの識別子が参照されているかがあいまいになります。
  • 外側のパラメーターをシャドウする内部型パラメーターには別の名前を使用します (CS0693CS8387)。 ジェネリック メンバー (メソッドや入れ子になった型など) がジェネリック クラスまたはメソッド内にある場合、内部型パラメーターは必ずしも外側の型パラメーターと同じではありません。 同じ名前を付けると、どの型パラメーターが参照されているかが混乱します。 内部型パラメーターには個別の名前を使用します。
  • 制約句のすべての型パラメーターが型パラメーター リスト (CS0699) で宣言されていることを確認します。 where句では、ジェネリック宣言に含まれる型パラメーターのみを参照できます。 where句の名前が宣言された型パラメーターと一致しない場合は、入力ミスやスペルミスがないか確認してください。
  • 正しいレコード宣言構文 (CS9012) を使用します。 レコード型を宣言するときは、 record class または record struct (または参照型の場合は record のみ) を使用する必要があります。 record キーワードだけでは、コンパイラが別の宣言構文を想定している位置には表示できません。

詳細については、「ジェネリック型パラメーターとジェネリックを参照してください。

制約の宣言と順序付け

  • CS0401: new()制約は、指定された最後の制限制約である必要があります。
  • CS0406: クラス型制約 'constraint' は、他の制約の前に存在する必要があります。
  • CS0409: 型パラメーター 'type parameter' に制約句が既に指定されています。型パラメーターのすべての制約は、1 つの where 句で指定する必要があります。
  • CS0449: classstructunmanagednotnull、およびdefaultの制約を結合または複製することはできず、制約リストで最初に指定する必要があります。
  • CS0450: 型パラメーター: 制約クラスと class 制約または struct 制約の両方を指定できません。
  • CS0451: new()制約をstruct制約と共に使用することはできません。
  • CS8375: 'new()' 制約を 'unmanaged' 制約と共に使用することはできません。
  • CS8380: 'type': 制約クラスと 'アンマネージ' 制約の両方を指定できません。
  • CS9011: キーワード delegate は制約として使用できません。 System.Delegateを意味しましたか?

型パラメーターに対する制約は、最初にプライマリ制約 (classstructunmanagednotnull、または default) に従い、次にクラス型制約、インターフェイス制約、最後に new() コンストラクター制約の順に従う必要があります。 一部の制約は相互に排他的であり、組み合わせることはできません。 1 つの型パラメーターのすべての制約は、1 つの where 句に含める必要があります。

  • new()制約を制約リストの末尾に配置します (CS0401)。 new()制約は、他のすべての制約の後に指定する必要があります。 たとえば、where T : new(), IDisposablewhere T : IDisposable, new() に変更します。
  • インターフェイス制約 (CS0406) の前にクラス型制約を配置します。 型パラメーターをインターフェイスと共に特定の基底クラスに制約する場合は、クラスを最初に指定する必要があります。 たとえば、where T : IDisposable, MyBaseClasswhere T : MyBaseClass, IDisposable に変更します。
  • 型パラメーターのすべての制約を 1 つの where 句に結合します (CS0409)。 同じ型パラメーターに複数の where 句を使用することはできません。 それらを 1 つの句にマージします。 where T : I where T : new()where T : I, new() に変更します。 複数の where 句は、異なる型パラメーターを対象とする場合にのみ有効です。
  • プライマリ制約を最初に配置し、相互に排他的な制約を組み合わせないでください (CS0449)。 classstructunmanagednotnull、またはdefaultのいずれかを指定でき、制約リストの先頭に表示する必要があります。 class制約とstruct制約は、classunmanagedと同様に相互に排他的です。
  • 特定のクラス制約を classstruct、または unmanaged (CS0450CS8380) と組み合わせないでください。 型パラメーターが特定のクラス型に制約されている場合は、暗黙的に参照型であり、 struct 制約または unmanaged 制約と矛盾します。 クラス制約またはプライマリ制約を削除します。
  • new()structまたはunmanaged (CS0451CS8375) と組み合わせないでください。 すべての値型には、暗黙的にパブリック パラメーターなしのコンストラクターがあるため、 new() 制約は、 structと組み合わせると冗長になります。 unmanagedにも同じことが当てはまります。これは、structを意味します。 new()制約を削除します。
  • delegateを制約句のSystem.Delegateに置き換えます (CS9011)。 delegate キーワードは、制約としてではなく、デリゲート型を宣言するために使用されます。 型パラメーターをデリゲート型に制約するには、制約型として System.Delegate を使用します。

詳細については、「型パラメーターの制約」を参照してください。

有効な制約の種類

  • CS0405: 型パラメーターの制約が重複しています。
  • CS0701: 'identifier' は有効な制約ではありません。制約として使用される型は、インターフェイス、非シール クラス、または型パラメーターである必要があります。
  • CS0702: 制約を特殊クラスにすることはできません。
  • CS0703: アクセシビリティに一貫性がありません:制約の型は宣言よりもアクセシビリティが低くなります。
  • CS0706: 制約の種類が無効です。制約として使用される型は、インターフェイス、非シール クラス、または型パラメーターである必要があります。
  • CS0717: 静的クラス: 静的クラスを制約として使用することはできません。
  • CS3024: 制約型 'type' は CLS に準拠していません。

制約は、インターフェイス、非シール クラス、または型パラメーターである必要があります。 特定の型は、.NET 型システムでの特別な意味や継承できないため、制約として無効です。

  • 重複する制約を削除します (CS0405)。 各制約は、制約句で 1 回だけ使用できます。 where T : I, Iがある場合は、重複を削除します。
  • 非シール型のみを制約として使用します (CS0701)。 シールクラス、構造体、および列挙型は継承できないため、制約として目的を果たしません。 目的の型が実装するインターフェイスを使用するか、シールされていない基底クラスを使用します。
  • 制約として特殊なクラスを使用しないでください (CS0702)。 ObjectArray、およびValueTypeの型は制約として使用できません。 すべての型は既に Objectから派生しているため、それに制約しても値は提供されません。 Array ValueTypeは、直接継承できない抽象基本型です。 配列のような動作が必要な場合は、代わりに IList<T> または IEnumerable<T> を使用します。
  • 制約の型がジェネリック型 (CS0703) と同程度にアクセスできることを確認します。 外部コードでは有効な型引数を指定できないため、パブリック ジェネリック型は内部型を使用して制約を持つことができません。 制約型をパブリックにするか、ジェネリック型のアクセシビリティを低下させます。
  • インターフェイス、非シール クラス、または型パラメーターのみを制約として使用します (CS0706)。 配列、シール クラス、構造体、列挙型、またはその他の無効な型を制約として使用することはできません。 目的の型が実装するインターフェイスの使用を検討してください。
  • 静的クラスを制約として使用しないでください (CS0717)。 静的クラスには静的メンバーのみが含まれているため、拡張できません。 静的クラスから派生できる型がないため、制約として役に立ちません。
  • 型制約に CLS 準拠型を使用します (CS3024)。 アセンブリが [assembly: CLSCompliant(true)] でマークされている場合、CLS に準拠していない型をジェネリック型制約として使用すると、一部の言語で記述されたコードでジェネリック クラスを使用できなくなる可能性があります。

詳細については、「型パラメーターの制約」を参照してください。

制約充足と変換

  • CS0311: ジェネリック型またはメソッドで型パラメーター T として型を使用することはできません。'type1' から 'type2' への暗黙的な参照変換はありません。
  • CS0312: その型は、ジェネリック型またはメソッドの型パラメーターとして使用できません。null 許容型は 'constraint' の制約を満たしていません。
  • CS0313: ジェネリック型またはメソッドで型パラメーターとして型を使用することはできません。null 許容型が 'constraint' の制約を満たしていません。Null 許容型は、どのインターフェイス制約も満たできません。
  • CS0314: ジェネリック型またはメソッドで型パラメーターとして型を使用することはできません。'type' から 'constraint' へのボックス化変換または型パラメーター変換はありません。
  • CS0315: ジェネリック型またはメソッドで型パラメーター T として型を使用することはできません。'type' から 'constraint' へのボックス化変換はありません。
  • CS0452: ジェネリック型またはメソッド 'generic' でパラメーター 'parameter name' として使用するには、型 'type name' は参照型でなければなりません。
  • CS0453: ジェネリック 型またはメソッド 'generic' でパラメーター 'parameter name' として使用するには、型 'type name' が null 非許容値型である必要があります。
  • CS8377: ジェネリック型またはメソッド 'generic' のパラメーター 'parameter' として使用するには、型 'type' は、任意の入れ子レベルにあるすべてのフィールドも含めて、null 非許容の値型である必要があります。

これらのエラーは、型引数がジェネリック型パラメーターで宣言された制約を満たしていない場合に発生します。 型引数には、すべての制約に一致する正しい変換、継承リレーションシップ、および構造プロパティが必要です。

  • 型引数を、制約型 (CS0311) への暗黙的な参照変換を持つ引数に変更します。 型パラメーターに where T : BaseType のような制約がある場合、暗黙的な参照変換または ID 変換によって、任意の型引数を BaseType に変換できる必要があります。 暗黙的な数値変換 ( short から int など) は、ジェネリック型パラメーターの制約を満たしていません。
  • null 非許容値型を使用するか、制約の型 (CS0312CS0313) を変更します。 null 許容値型 ( int? など) は、基になる値型とは異なり、同じ制約を満たしていません。 null 許容値型は、null 許容ラッパー自体がインターフェイスを実装していないため、インターフェイスの制約を満たすことはできません。 値型の null 非許容形式を型引数として使用します。
  • 派生クラス宣言 (CS0314) で基底クラスの型パラメーター制約を繰り返します。 派生ジェネリック クラスが制約付き基底ジェネリック クラスから継承する場合、派生クラスは対応する型パラメーターに対して同じ制約を宣言する必要があります。
  • 型引数が参照型またはクラス制約 (CS0315) を満たしていることを確認します。 型パラメーターがクラス型に制約されている場合、制約リレーションシップを満たすボックス変換がないため、値型 (構造体) を型引数として使用することはできません。 制約を継承または実装する参照型を使用します。
  • class制約が指定されている場合は、型引数として参照型を使用します (CS0452)。 structintなどの値型は、class制約を満たすことはできません。 型引数を参照型に変更するか、ジェネリック型が値型で動作できる場合は class 制約を削除します。
  • struct制約が指定されている場合は、null 非許容値型を型引数として使用します (CS0453)。 参照型、null 許容値型 (int?)、およびその他の値以外の型は、 struct 制約を満たすことはできません。 intdouble、ユーザー定義のstructなど、null 非許容の具体的な値型を使用します。
  • unmanaged制約が指定されている場合は、フィールドがすべてのアンマネージ型である型を使用します (CS8377)。 unmanaged 制約では、null を許容しない値型であり、入れ子になった各レベルにあるすべてのフィールドもアンマネージ型であることが要求されます。 アンマネージとして認識されていない参照型フィールドまたはジェネリック型パラメーターを含む型は、この制約を満たしていません。

詳細については、「型パラメーターの制約」を参照してください。

制約の競合と循環依存関係

  • CS0454: 型パラメーター 1 と型パラメーター 2 に関連する循環制約の依存関係。
  • CS0455: 型パラメーターは、競合する制約 'constraint1' と 'constraint2' を継承します。
  • CS0456: 型パラメーター '型パラメーター 1' には 'struct' 制約があるため、'型パラメーター 1' は '型パラメーター 2' の制約として使用できません。
  • CS8379: 型パラメーター '型パラメーター 1' には 'アンマネージ' 制約があるため、'型パラメーター 1' は '型パラメーター 2' の制約として使用できません。

制約では循環依存関係を作成できません。型パラメーターは、同時に満たすことができない競合する制約を継承できません。 値型制約 (structunmanaged) は暗黙的にシールされるため、他の型パラメーターの制約として使用することはできません。

  • 循環制約の依存関係を削除します (CS0454)。 型パラメーターは、制約によって直接または間接的にそれ自体に依存することはできません。 たとえば、 where T : U where U : T は循環依存関係を作成します。 制約の 1 つを削除して、サイクルを中断します。
  • 競合する継承された制約を削除します (CS0455)。 C# では複数のクラス継承がサポートされていないため、型パラメーターを複数の関連のないクラスに制限することはできません。 同様に、 struct とクラス型の両方に制約することはできません。 型階層を再構築するか、競合する制約のいずれかを削除します。
  • 別の型パラメーター (structunmanaged) の制約として、制約型または制約型パラメーターを使用しないでください。 値型制約は暗黙的にシールされるため、他の型から派生することはできません。 このエラーを解決するには、最初の型パラメーターを介して間接的に制約するのではなく、値型またはアンマネージ制約を 2 番目の型パラメーターに直接配置します。

詳細については、「型パラメーターの制約」を参照してください。

オーバーライドと実装の制約規則

  • CS8665: メソッド 'method' は型パラメーター 'type parameter' の 'class' 制約を指定しますが、オーバーライドまたは明示的に実装されたメソッド 'method' の対応する型パラメーター 'type parameter' は参照型ではありません。
  • CS8666: メソッド 'method' は型パラメーター 'type parameter' の 'struct' 制約を指定しますが、オーバーライドまたは明示的に実装されたメソッド 'method' の対応する型パラメーター 'type parameter' は null 非許容値型ではありません。
  • CS8822: メソッド 'method' は型パラメーター 'type parameter' の 'default' 制約を指定しますが、オーバーライドまたは明示的に実装されたメソッド 'method' の対応する型パラメーター 'type parameter' は、参照型または値型に制限されます。
  • CS8823: 'default' 制約は、オーバーライドおよび明示的なインターフェイス実装メソッドでのみ有効です。

仮想メソッドをオーバーライドする場合、またはインターフェイス メソッドを明示的に実装する場合、オーバーライドするメソッドの型パラメーターに対する制約は、基本メソッドの制約と互換性がある必要があります。 default制約は、型パラメーターにclass制約もstruct制約もないことを示すために、オーバーライドおよび明示的なインターフェイス実装シナリオでのみ使用される特殊な修飾子です。

  • オーバーライドするメソッドの制約が基本メソッドの制約 (CS8665CS8666) と一致していることを確認します。 基本メソッドの対応する型パラメーターが参照型に制約されていない場合、オーバーライドは class 制約を追加できません。 同様に、基本メソッドの型パラメーターが値型に制約されていない場合、 struct 制約を追加することはできません。 オーバーライドは、基本宣言と互換性がある必要があります。
  • 基本メソッドの型パラメーターが制約されていない場合にのみ、 default 制約を使用します (CS8822)。 default制約は、型パラメーターにclass制約またはstruct制約がないことを示します。 オーバーライドされたメソッドの対応する型パラメーターに既にdefault制約またはclass制約がある場合、structを適用することはできません。
  • default制約は、オーバーライドまたは明示的なインターフェイス実装メソッド (CS8823) でのみ使用します。 default制約は、通常のメソッド宣言では有効ではありません。 これは、ベースに制約のない型パラメーターがあるメソッドをオーバーライドするときに明確に区別するために存在し、オーバーライドによって制約が適用されていないことも示す必要があります。

詳細については、「 型パラメーターの制約default 制約」を参照してください。

コンストラクターの制約

  • CS0304: new()制約がないため、変数型のインスタンスを作成できません。
  • CS0310: ジェネリック型またはメソッドでパラメーターとして使用するには、パブリック パラメーターなしのコンストラクターを持つ非抽象型である必要があります。
  • CS0417: 識別子: 変数型のインスタンスを作成するときに引数を指定できません。

これらのエラーは、 new() 制約に関連し、 new 演算子を使用して型パラメーターをインスタンス化します。

  • インスタンス化する必要がある型パラメーターに new() 制約を追加します (CS0304)。 ジェネリック型またはメソッド内で new T() を使用する場合、コンパイラは、任意の型引数にパラメーターなしのコンストラクターがあることを保証する必要があります。 new()制約によって、この保証が提供されます。
  • 型引数にパブリック パラメーターなしのコンストラクター (CS0310) があることを確認します。 型パラメーターに new() 制約がある場合、型引数として使用される具象型は非抽象型であり、パラメーターなしのパブリック コンストラクターを提供する必要があります。 プライベート、保護、またはパラメーター化されたコンストラクターのみを持つ型は、 new() 制約を満たすことはできません。
  • 型パラメーターをインスタンス化するときにコンストラクターの引数を削除します (CS0417)。 new()制約では、パラメーターなしのコンストラクターのみが保証されます。 引数を new T(arguments)に渡すことはできません。 特定の引数を持つインスタンスを構築する必要がある場合は、ファクトリ パターンまたは構築動作を定義するインターフェイス制約の使用を検討してください。

詳細については、「 型パラメーターの制約new() 制約」を参照してください。

型引数の数と使用法

  • CS0224: vararg を持つメソッドは、ジェネリックにすることも、ジェネリック型にすることも、params パラメーターを持つことはできません。
  • CS0305: ジェネリック型を使用するには、N 個の型引数が必要です。
  • CS0306: 型を型引数として使用することはできません。
  • CS0307: 'identifier' は型引数と共に使用できません。
  • CS0308: 非ジェネリック型または非ジェネリック メソッドを型引数と共に使用することはできません。
  • CS7002: ジェネリック名の予期しない使用。
  • CS8389: 現在のコンテキストでは、型引数を省略することはできません。

これらのエラーは、ジェネリック型とメソッドに正しい数と型の引数を指定することに関連しています。

  • __arglist (CS0224) を使用するメソッドからジェネリック型パラメーターを削除するか、ジェネリック型宣言を含めます。 __arglist キーワードはジェネリックと互換性がありません。これは、可変引数リストを処理するためのランタイム メカニズムが、ジェネリック型パラメーターに必要な型置換と競合するためです。
  • ジェネリック宣言 (CS0305) で指定された型引数の正確な数を指定します。 ジェネリック型がインスタンス化されるときに、定義内の各ジェネリック型パラメーターに対応する型引数が必要です。
  • 型引数として有効な型のみを使用します (CS0306)。 ジェネリック型にはガベージ コレクターが追跡できるマネージド型が必要であるため、ポインター型 ( int*char*など) は型引数として使用できません。
  • 非ジェネリック コンストラクト (CS0307、CS0308) から型引数構文を削除します。 山かっこで囲まれた型引数は、型パラメーターを宣言するジェネリック型とメソッドにのみ適用できます。 型のジェネリック バージョンを含む名前空間をインポートしたことを確認します。
  • ジェネリック (CS7002) をサポートしていない宣言から型パラメーターを削除します。 列挙型などの一部のコンストラクトをジェネリックにすることはできません。 列挙型の値にジェネリック コンテナーが必要な場合は、代わりにジェネリック クラスまたは構造体を使用することを検討してください。
  • 必要なすべての型引数を明示的に指定します (CS8389)。 typeof演算子の使用やデリゲートの作成など、一部のコンテキストでは、すべての型引数を指定する必要があり、省略することはできません。 たとえば、型引数を省略するのではなく、 typeof(List<int>) を使用します。

詳細については、「ジェネリック型パラメーターとジェネリックを参照してください。

型引数の推論

  • CS0411: メソッド 'method' の型引数は、使用法から推論できません。型引数を明示的に指定してみてください。

このエラーは、型引数を明示的に指定せずにジェネリック メソッドを呼び出し、コンパイラが目的の型引数を推測できない場合に発生します。 コンパイラは、呼び出しサイトで渡すメソッド引数の型から型引数を推論します。

  • 山かっこで明示的に型引数を指定します (CS0411)。 コンパイラがメソッド引数から型引数を特定できない場合は、それらを直接指定します。 たとえば、G()G<int>() に変更します。 このエラーは一般的に、ジェネリック メソッドに型を推論するパラメーターがない場合、または null 引数が渡され、コンパイラが目的の型を特定できない場合に発生します。

詳細については、「 ジェネリック メソッド」を参照してください。

型パラメーターの分散

  • CS1960: 無効な分散修飾子。バリアント型として指定できるのは、インターフェイスとデリゲート型のパラメーターのみです。
  • CS1961: 無効な分散: 型パラメーターは、'type' で共変に有効である必要があります。'type parameter' は反変です。
  • CS8427: 列挙型、クラス、および構造体は、'in' または 'out' 型パラメーターを持つインターフェイスでは宣言できません。

分散修飾子 (反変性のin 、共変性の out ) は、インターフェイスおよびデリゲート宣言で型パラメーターを使用する方法を制御します。 インターフェイスとデリゲートのみが分散をサポートします。 共変 (out) 型パラメーターは出力位置 (戻り値の型) にのみ表示できますが、反変 (in) 型パラメーターは入力位置 (パラメーター型) でのみ使用できます。

  • 分散修飾子は、インターフェイスおよびデリゲート型パラメーター (CS1960) でのみ使用します。 クラス、構造体、およびその他の型宣言では、分散修飾子はサポートされていません。 型パラメーターに対してinterfaceまたはdelegateを使用できるのは、in宣言とout宣言だけです。
  • 戻り値の型にのみ表示される型パラメーターには out (共変) を使用し、パラメーター型にのみ表示される型パラメーターには in (反変) を使用します (CS1961)。 入力位置と出力位置の両方に型パラメーターを指定する必要がある場合は、分散修飾子を削除します。
  • バリアント インターフェイス (CS8427) 内で列挙型、クラス、または構造体を宣言しないでください。 inまたはout型パラメーターを持つインターフェイス内の入れ子になった型宣言は、分散の安全性規則に違反する可能性があるため、許可されません。 入れ子になった型をインターフェイス宣言の外側に移動します。

詳細については、「ジェネリックの 共変性と反変性」を参照してください。

ジェネリック型の利用制約

  • CS0403: null 非許容値型である可能性があるため、null を型パラメーターに変換できません。代わりに default(T) を使用することを検討してください。
  • CS0413: クラス型制約もas制約もないため、型パラメーターを class 演算子と共に使用することはできません。
  • CS0695: 'type' は'interface1' と 'interface2' の両方を実装できません。これは、一部の型パラメーターの置換で統一される可能性があるためです。
  • CS0698: ジェネリック型は属性クラスであるため、型から派生できません。
  • CS0704: 'type' の仮想メンバー以外の参照は、型パラメーターであるため実行できません。
  • CS0718: 'type': 静的型は型引数として使用できません。
  • CS1720: 'ジェネリック型' の既定値が null であるため、式によって常に System.NullReferenceException が発生します。
  • CS1763: 'parameter' は型 'type' です。文字列以外の参照型の既定のパラメーター値は、null でのみ初期化できます。
  • CS8322: 動的型の引数を、推論された型引数を持つジェネリック ローカル関数に渡すことはできません。
  • CS9338: 型のアクセシビリティがクラスよりも低くなっています。

これらのエラーは、式、継承、およびメンバー アクセスでジェネリック型と型パラメーターを使用する方法に関する制限に関連しています。

  • null割り当てをdefault(T)に置き換えるか、class制約を追加します (CS0403)。 制約のない型パラメーターに null を割り当てると、コンパイラは型引数が参照型であることを保証できません。 任意の型に適切な既定値を提供する default(T)を使用するか、参照型セマンティクスが特に必要な場合は class 制約を追加します。
  • class演算子 (as) を使用する場合は、または特定の型制約を追加します。 変換に失敗した場合、 as 演算子は null を返しますが、値型を nullすることはできません。 class制約を追加して、型パラメーターが常に参照型であることを確認します。
  • 統合可能な型パラメーターを使用して同じジェネリック インターフェイスを複数回実装しないでください (CS0695)。 クラスが異なる型パラメーター ( class G<T1, T2> : I<T1>, I<T2> など) を使用してジェネリック インターフェイスを複数回実装すると、両方のパラメーターに同じ型を使用してインスタンス化すると競合が発生します。 インターフェイスを 1 回だけ実装するか、統一を防ぐために再構築します。
  • 属性クラス (CS0698) からジェネリック型パラメーターを削除します。 ジェネリック属性がサポートされているため、このエラーは現在のバージョンの C# では生成されなくなりました。
  • 入れ子になったメンバー アクセス (CS0704) には、型パラメーターの代わりに具象制約型を使用します。 型パラメーターを使用して、入れ子になった型または非仮想メンバーにアクセスすることはできません。 T.InnerTypeの代わりに、BaseClass.InnerTypeなどの既知の制約型を直接使用します。
  • 型引数として静的型を使用しないでください (CS0718)。 静的型をインスタンス化することはできないため、ジェネリック引数として使用することはできません。 ジェネリック引数から静的な型を削除します。
  • default(T)が参照型 (T) に制限されている場合は、でインスタンス メンバーを呼び出さないようにします。 Tclass制約がある場合、default(T)nullされるため、その上でインスタンス メンバーを呼び出すと常にNullReferenceExceptionがスローされます。 メンバーを呼び出す前に null チェックを追加するか、 default(T) を直接使用しないようにコードを再構築します。
  • 型が参照型 (null) である省略可能なパラメーターの既定のパラメーター値として、を使用します。 ジェネリック メソッドにT型のパラメーターがあり、Tが参照型の場合は、省略可能なパラメーターの既定値はコンパイル時定数である必要があり、default(U)はその要件を修正しないため、nulldefault(T)に置き換えます。
  • 動的な値をジェネリック ローカル関数 (CS8322) に渡すときに、型引数を明示的に指定します。 ジェネリック ローカル関数に dynamic 引数を渡すと、コンパイラは型引数を推論できません。 型引数を明示的に指定するか、動的値をキャストします。
  • パブリックまたは保護されたシグネチャで使用される型引数が、少なくともメンバー (CS9338) と同じくらいアクセス可能であることを確認します。 パブリック ジェネリック メンバーは、パブリックにアクセスできる型引数を使用する必要があります。 型引数をパブリックにするか、メンバーのアクセシビリティを低下させます。

詳細については、「型パラメーターと既定値の式に対する制約」を参照してください。

UnmanagedCallersOnly 制約

  • CS8893: 'type' は'UnmanagedCallersOnly' の有効な呼び出し規則型ではありません。
  • CS8894: 'UnmanagedCallersOnly' に属性付きメソッドのパラメーターまたは戻り値の型として 'type' を使用できません。
  • CS8895: 'UnmanagedCallersOnly' で属性付けされたメソッドはジェネリック型パラメーターを持つことができず、ジェネリック型で宣言できません。
  • CS8896: 'UnmanagedCallersOnly' は、通常の静的な非抽象メソッド、非仮想メソッド、または静的ローカル関数にのみ適用できます。

UnmanagedCallersOnlyAttribute属性は、アンマネージ コードが呼び出すことができるメソッドをマークします。 これらのメソッドには厳密な要件があります。ランタイムはマネージド呼び出し規則とアンマネージド呼び出し規則の間の遷移を処理する必要があるためです。

  • UnmanagedCallersOnly属性 (CS8893) では、有効な呼び出し規則の型のみを使用します。 属性の CallConvs プロパティは、 System.Runtime.CompilerServices 名前空間から認識される呼び出し規則の型のみを受け入れます。
  • blittable 型のみをパラメーター型と戻り値の型として使用します (CS8894)。 UnmanagedCallersOnlyでマークされたメソッドでは、マネージド型 (stringobjectなど) をパラメーターとして使用したり、戻り値の型を使用したりすることはできません。アンマネージ呼び出し元はガベージ コレクションされた参照を管理できないためです。
  • UnmanagedCallersOnly メソッドからジェネリック型パラメーターを削除し、ジェネリック型 (CS8895) で宣言しないでください。 アンマネージ呼び出し規則はジェネリックをサポートしていません。これは、ランタイムがジェネリック型置換の正しい呼び出し規則を判断できないためです。
  • UnmanagedCallersOnlyは、通常の静的メソッド、非抽象メソッド、非仮想メソッド、または静的ローカル関数 (CS8896) にのみ適用します。 アンマネージ呼び出し元は、これらのメソッドで必要なディスパッチ メカニズムを実行できないため、インスタンス メソッド、抽象メソッド、および仮想メソッドを UnmanagedCallersOnly でマークすることはできません。

詳細については、「UnmanagedCallersOnlyAttribute」を参照してください。