次の方法で共有


オーバーロードの解決に影響するエラーと警告を解決します。

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

  • CS0034 - type1」および「type2」型のオペランドに対して演算子があいまいです
  • CS0035 - 「type」型のオペランドに対して演算子があいまいです
  • CS0111 - 型は、同じパラメーター型を持つ「name」というメンバーをすでに定義しています
  • CS0121 - 次のメソッドとプロパティ間で呼び出しがあいまいです
  • CS0457 - 「type1」から「type2」への返還時にあいまいなユーザーが変換を定義しました
  • CS0663 - ref および out のみで異なるオーバーロード メソッドを定義できません。
  • CS1007 - プロパティ アクセサーは既に定義されています。
  • CS1019 - オーバーロード可能な単項演算子が必要です
  • CS1020 - オーバーロード可能な 2 項演算子が必要です
  • CS1501 - 「number」引数を指定するメソッド「method」に対してオーバーロードはありません
  • CS1534 - オーバーロードされた 2 項演算子「operator」には、2 つのパラメーターを指定します
  • CS1535 - オーバーロードされた単項演算子「operator」には、1 つのパラメーターを指定します。
  • CS1928 - 「Type」には、「method」の定義は含まれず、最適なメソッド オーバーロード「method」に、いくつかの無効な引数があります
  • CS1929 - 「TypeA」には、「method」の定義は含まれず、最適なメソッド オーバーロード「TypeB.method」に、「TypeC」のレシーバーが必要です
  • CS8315 - 演算子が、オペランドであいまいです
  • CS9261 - オーバーライド メンバーでは、「OverloadResolutionPriorityAttribute」を使用できません。
  • CS9262 - このメンバーでは、「OverloadResolutionPriorityAttribute」を使用できません。

さらに、次のコンパイラの警告が表示されます。

  • CS3006 - ref または out、または配列のランクのみが異なるオーバーロード メソッド「method」は、CLS に準拠していません

オーバーロード定義が正しくありません

  • CS0663 - ref および out のみで異なるオーバーロード メソッドを定義できません。
  • CS1019 - オーバーロード可能な単項演算子が必要です
  • CS1020 - オーバーロード可能な 2 項演算子が必要です
  • CS1534 - オーバーロードされた 2 項演算子 'operator' に指定できるパラメーター数は 2 です
  • CS1535 - オーバーロードされた単項演算子 'operator' に指定できるパラメーター数は 1 です

さらに、次のコンパイラの警告が表示されます。

  • CS3006 - ref または out 配列のランクのみが異なるオーバーロード メソッド「method」は、CLS に準拠していません

クラスでオーバーロードされた演算子を作成する場合、署名は、その演算子に必要なパラメーターの数と一致する必要があります。 演算子定義のパラメーター数が間違っています。

また、オーバーロード演算子では、定義された演算子名を使用する必要があります。 唯一の例外は、演算子名が変換の戻り値の型と一致する変換演算子を作成する場合です。

重複するオーバーロードが定義されている

  • CS0111 - 型は、同じパラメーター型を持つ「name」というメンバーをすでに定義しています
  • CS1007 - プロパティ アクセサーは既に定義されています

これらのエラーは、異なるオーバーロードを作成したことを示しています。 一般的に、次のような理由が考えられます。

  • 一致するパラメーター型には ID 変換があります。 たとえば、M(dynamic)M(object)M2(string)M2(string?) などが挙げられます。
  • 一致するパラメーター型は、参照修飾子でのみ異なります。 たとえば、M(ref int)M(out int) です。
  • プロパティの init アクセサーと set アクセサーの両方を含めます。

オーバーロードが見つかりません

  • CS1501 - 引数「number」を指定するメソッド「method」のオーバーロードはありません
  • CS1928 - 「Type」に「method」の定義が含まれておらず、最も適している拡張メソッド オーバーロード「method」には正しくない引数がいくつか含まれています
  • CS1929 - 「TypeA」には、「method」の定義は含まれず、最適なメソッド オーバーロード「TypeB.method」に、「TypeC」のレシーバーが必要です

コードは名前が存在するメソッドを呼び出しますが、一部の引数が正しくないか、間違った数の引数を使用しています。 拡張メソッドを呼び出そうとしている場合は、包含クラスがインポートされていない名前空間にある場合があります。

Note

エラー CS1928 は、最新のコンパイラでは使用されません。 新しいコンパイラでは、CS1929 のみを使用します。

あいまいなオーバーロード

  • CS0034 - type1」および「type2」型のオペランドに対して演算子があいまいです
  • CS0035 - 「type」型のオペランドに対して演算子があいまいです
  • CS0121 - 次のメソッドとプロパティ間で呼び出しがあいまいです
  • CS0457 - 「type1」から「type2」への返還時にあいまいなユーザーが変換を定義しました
  • CS8315 - 演算子が、オペランドであいまいです

これらのエラーは、他のオーバーロードよりも優れたオーバーロードがないことを示しています。 これらエラーには以下のような複数の原因が考えられます。

  • パラメーターごとに異なる引数が適しています。 1 つは完全に一致する可能性があり、もう 1 つは変換が必要です。

      void M(int a, double b) {    }
      void M(double a, int b) {}
    
      M(1, 1); // ambiguous
    
  • 複数のユーザー定義変換演算子が候補です。 変換演算子は、ソース型、その基本型、変換先の型、またはその基本型で宣言できます。 変換演算子が複数で定義されている場合、コンパイラは選択できません。

  • 複数の変換演算子で互換性のある変換を実行できます。

  • 1 つ以上の引数で (default(T) ではなく) default を使用し、複数の型を選択できます。

ほとんどの場合、明示的なキャストを追加すると、選択するオーバーロードを指定できます。

オーバーロード解決の優先順位

  • CS9261 - オーバーライド メンバーでは、「OverloadResolutionPriorityAttribute」を使用できません。
  • CS9262 - このメンバーでは、「OverloadResolutionPriorityAttribute」を使用できません。

コードが、OverloadResolutionPriorityAttribute を使用して、別のオーバーロードではなく 1 つのオーバーロードを優先する規則に違反しています。 次のメソッドの型に OverloadResolutionPriorityAttribute を適用することはできません。

  • 非インデクサー プロパティ
  • プロパティ、インデクサー、またはイベント アクセサー
  • 変換演算子
  • ラムダ
  • ローカル関数
  • ファイナライザー
  • 静的コンストラクター

さらに、OverloadResolutionPriorityAttributevirtual メンバーまたは abstract メンバーの override に適用できません。 コンパイラは、基本型宣言の値を使用します。