new式とオブジェクトの作成に関するエラーと警告を解決する

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

  • CS0144: 抽象型またはインターフェイス 'type' のインスタンスを作成できません
  • CS0712: 静的クラス 'type' のインスタンスを作成できません
  • CS1526: 新しい式には、型の後に引数リストまたは ()、[]、または{}が必要です
  • CS8181: 'new' をタプル型と共に使用することはできません。代わりにタプル リテラル式を使用してください。
  • CS8386: オブジェクトの作成が無効です
  • CS8752: 型 'type' は new() のターゲット型として使用できません
  • CS8753: new() の使用は、このコンテキストでは無効です
  • CS8754: 'expression' のターゲット型がありません

インスタンス化できない型

  • CS0144: 抽象型またはインターフェイス 'type' のインスタンスを作成できません
  • CS0712: 静的クラス 'type' のインスタンスを作成できません

new演算子は、具象の非静的型のインスタンスのみを作成できます。 この言語では、抽象クラス、インターフェイス、静的クラスのインスタンス化は禁止されています。これらの型は不完全であるか、インスタンスを持つよう設計されていないためです。

  • 抽象クラスから派生する具象クラスを作成するか、インターフェイスを実装するクラスを作成してから、その具象型 (CS0144) をインスタンス化します。 new クラスまたはabstractでは完全な実装が提供されないため、interfaceを直接使用することはできません。 型を所有している場合は、 abstract 修飾子を削除して、クラスを直接インスタント化することもできます。
  • new式を削除し、クラス名 (CS0712) を介して静的クラス メンバーに直接アクセスします。 静的クラスは、静的メンバーをグループ化するためだけに存在し、インスタンス化することはできません。 インスタンスが必要な場合は、クラス宣言から static 修飾子を削除します。

詳細については、「 抽象インターフェイスおよび静的クラスと静的クラス メンバー」を参照してください。

new 式の構文エラー

  • CS1526: 新しい式には、型の後に引数リストまたは ()、[]、または{}が必要です
  • CS8181: 'new' をタプル型と共に使用することはできません。代わりにタプル リテラル式を使用してください。
  • CS8386: オブジェクトの作成が無効です

これらのエラーは、 new 式の構文の形式が正しくない場合、または別の作成構文を必要とする型で new を使用する場合に発生します。

  • ()式 ([]) の型名の後に、引数リスト {}、配列次元new、または初期化子を追加します。 new演算子では、オブジェクトの構築方法を示すために、次のいずれかが必要です。 たとえば、new MyClass()ではなくnew MyClassを記述します。
  • new (int, string)(...)(1, "hello") (CS8181) などのタプル リテラル式に置き換えます。 タプル型では、 new 演算子ではなく、専用のリテラル構文が使用されます。 タプルを作成するには、かっこでつながれた値 ( (int X, string Y) point = (1, "hello");) を直接使用します。
  • new式が有効な構築可能な型 (CS8386) をターゲットにしていることを確認します。 このエラーは、コンパイラが構文から有効なオブジェクトの作成を判断できない場合に発生します。 構築をサポートする型名を使用していること、および式が構文的に完全であることを確認します。

詳細については、「 新しい演算子タプル型」を参照してください。

ターゲット型の new

  • CS8752: 型 'type' は new() のターゲット型として使用できません
  • CS8753: new() の使用は、このコンテキストでは無効です
  • CS8754: 'expression' のターゲット型がありません

ターゲット型の new 式 (C# 9 で導入) を使用すると、 MyClass x = new();のように、コンパイラがコンテキストから推論できる場合に型名を省略できます。 これらのエラーは、コンパイラが有効なターゲット型を特定できない場合、または推論された型が構築できない場合に発生します。

  • ターゲット型がインターフェイス、抽象クラス、静的クラス、またはその他の構築不可能な型 (new()) である場合は、ターゲット型のの代わりに明示的な型名を使用します。 ターゲット型の new() は、左側から型を推論しますが、推論される型は、具体的でインスタントな型である必要があります。 代わりに、完全な new ConcreteType() を記述します。
  • new()式を、ターゲット型が使用可能なコンテキストに移動します (CS8753)。 ターゲット型の new は、明示的な型を持つ変数宣言、代入式、既知の戻り値の型を持つ戻りステートメント、既知のパラメーター型を持つ引数の位置など、コンパイラが型を決定できるコンテキストでのみ有効です。 ターゲット型が存在しないnew()などのコンテキストでは、var x = new();を使用することはできません。
  • ターゲット型を推論できない場合は、 new 式に明示的な型を指定します (CS8754)。 このエラーは、コンパイラが構築する型を判断できない位置で new() を使用すると発生します。 new()new ExplicitType()に置き換えるか、変数をvarではなく明示的な型で宣言します。

詳細については、「 ターゲット型の新しい式」を参照してください。