次の方法で共有


演算子の宣言とオーバーフローのエラーと警告を解決する

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

  • CS0031: 定数値 'value' を 'type' に変換できません
  • CS0056: アクセシビリティに一貫性がありません。戻り値の型 'type' は、演算子 'operator' よりもアクセシビリティが低い
  • CS0057: アクセシビリティに一貫性がありません:パラメーター型 'type' は演算子 'operator' よりもアクセスできない
  • CS0215: 演算子 True または False の戻り値の型はブール値である必要があります
  • CS0216: 演算子 'operator' には、一致する演算子 'missing_operator' も定義する必要があります
  • CS0217: ショートサーキット演算子として適用できるようにするには、ユーザー定義の論理演算子 ('operator') は、その 2 つのパラメーターの型と同じ戻り値の型を持つ必要があります。
  • CS0218: 型 ('type') には、演算子 true と演算子 false の宣言が含まれている必要があります
  • CS0220: チェック モードでコンパイル時に操作がオーバーフローする
  • CS0221: 定数値 'value' を 'type' に変換できません ('unchecked' 構文を使用してオーバーライドします)
  • CS0448: ++演算子または--演算子の戻り値の型は、包含型であるか、包含型から派生している必要があります
  • CS0463: 10 進定数式の評価がエラー: 'error' のため失敗しました
  • CS0543: 'enumeration' : 列挙子の値が大きすぎて型に収まらない
  • CS0552: '変換ルーチン' : ユーザー定義のインターフェイス間の変換
  • CS0553: '変換ルーチン' : 基底クラスに対するユーザー定義の変換
  • CS0554: '変換ルーチン' : 派生クラスに対するユーザー定義の変換
  • CS0555: ユーザー定義演算子は、囲んでいる型のオブジェクトを受け取り、その型のオブジェクトへの変換はできません
  • CS0556: ユーザー定義変換は、囲む型に変換するか、または囲む型から変換する必要があります
  • CS0557: 型でのユーザー定義変換の重複
  • CS0558: ユーザー定義演算子を静的およびパブリックとして宣言する必要があります
  • CS0559: ++演算子または -- 演算子のパラメーター型は、包含型である必要があります
  • CS0562: 単項演算子のパラメーターは、包含型である必要があります
  • CS0563: 二項演算子のパラメーターの 1 つが包含型である必要があります
  • CS0564: オーバーロードされたシフト演算子の最初のオペランドは、含まれている型と同じ型を持つ必要があり、2 番目のオペランドの型は int である必要があります
  • CS0567: インターフェイスに演算子を含めることはできません
  • CS0590: ユーザー定義演算子は void を返すことができません
  • CS0594: 浮動小数点定数が型 'type' の範囲外です
  • CS0652: 整数定数との比較は役に立ちません。定数は型 'type' の範囲外です
  • CS0659: 'class' は Object.Equals(object o) をオーバーライドしますが、Object.GetHashCode() をオーバーライドしません
  • CS0660: 型はoperator ==またはoperator !=を定義しますが、Object.Equals(object o)をオーバーライドしません
  • CS0661: 型はoperator ==またはoperator !=を定義しますが、Object.GetHashCode()をオーバーライドしません
  • CS0715: 静的クラスにユーザー定義演算子を含めることはできません
  • CS1021: 整数定数が大きすぎます
  • CS1037: オーバーロード可能な演算子が必要です
  • CS1553: 宣言が無効です。その代わりに 'modifier 演算子 <dest-type> (...' を使用してください
  • CS8930: ユーザー定義演算子の明示的な実装を静的として宣言する必要がある
  • CS8931: インターフェイス内でのユーザー定義変換は、外側の型に制約された外側の型の型パラメーターへの変換またはそこからの変換でなければなりません
  • CS8778: 定数値 'value' は実行時に 'type' をオーバーフローする可能性があります ('unchecked' 構文を使用してオーバーライドします)
  • CS8973: 実行時に操作がオーバーフローする可能性があります (オーバーライドには 'unchecked' 構文を使用します)
  • CS9023: 演算子をチェックできません。
  • CS9024: 演算子をオフにすることはできません。
  • CS9025: 演算子では、一致するチェックされていないバージョンも宣言する必要があります。
  • CS9027: 予期しないキーワード 'unchecked'。
  • CS9308: ユーザー定義演算子はパブリックとして宣言する必要があります。
  • CS9310: この演算子の戻り値の型は void である必要があります。
  • CS9311: 型はインターフェイス メンバーを実装しません。メンバーの 1 つが演算子ではないため、型はメンバーを実装できません。
  • CS9312: 型は、継承されたメンバーの 1 つが演算子ではないため、オーバーライドできません。
  • CS9313: オーバーロードされた複合代入演算子は、1 つのパラメーターを受け取ります。
  • CS9340: オペランドに演算子を適用できません。最も適用できない候補が表示されます。
  • CS9341: オペランドに演算子を適用できません。最も適用できない候補が表示されます。
  • CS9342: 演算子の解決は、次のメンバー間であいまいです。

オペレーター署名の要件

  • CS0448: ++演算子または--演算子の戻り値の型は、包含型であるか、包含型から派生している必要があります。
  • CS0559: ++演算子または--演算子のパラメーター型は、包含型である必要があります。
  • CS0562: 単項演算子のパラメーターは、包含型である必要があります。
  • CS0563: 二項演算子のパラメーターの 1 つが包含型である必要があります。
  • CS0564: オーバーロードされたシフト演算子の最初のオペランドは、含む型と同じ型を持つ必要があり、2 番目のオペランドの型は int である必要があります。
  • CS0567: インターフェイスに演算子を含めることはできません。
  • CS0590: ユーザー定義演算子は void を返すことはできません。
  • CS9310: この演算子の戻り値の型は void である必要があります。
  • CS9340: オペランドに演算子を適用できません。最も適用できない候補が表示されます。
  • CS9341: オペランドに演算子を適用できません。最も適用できない候補が表示されます。
  • CS9342: 演算子の解決は、次のメンバー間であいまいです。

各演算子型には、言語仕様で定義された特定のパラメーターと戻り値の型の要件があります。 演算子をオーバーロードできる完全なルールについては、C# 仕様の 演算子のオーバーロード演算子 に関するページを参照してください。

  • ++演算子または--演算子の戻り値の型を、それを含む型またはそこから派生した型に変更します (CS0448)。 言語では、インクリメント演算子とデクリメント演算子は、結果を同じ変数に割り当て直すことができるように、包含型と互換性のある値を返す必要があります。
  • ++演算子または--演算子のパラメーターを包含型 (CS0559) に変更します。 インクリメント演算子とデクリメント演算子は、独自の型のインスタンスで動作する必要があります。
  • 単項演算子のパラメーターを包含型 (CS0562) に変更します。 単項演算子は、それらを宣言する型のオペランドを受け入れる必要があります。
  • 2 項演算子の少なくとも 1 つのパラメーターが包含型 (CS0563) であることを確認します。 コンパイラがその型を通じてそれらを解決できるように、二項演算子には宣言型が含まれている必要があります。
  • shift 演算子の最初のパラメーターを含む型に変更し、2 番目のパラメーターを int (CS0564) に変更します。 この言語では、シフト演算子を特定のシグネチャ (シフトする型と整数のシフト量) で定義します。
  • インターフェイスからクラスまたは構造体に演算子宣言を移動します (CS0567)。 インターフェイスでは、従来の (非静的抽象) 演算子宣言は許可されません。 インターフェイスの静的抽象演算子については、 静的抽象および仮想インターフェイス メンバー エラーに関するページを参照してください。
  • 演算子の戻り値の型を非 void 型 (CS0590) に変更します。 ほとんどのユーザー定義演算子は値を返す必要があります。 例外は複合代入演算子であり、 void 戻り値の型 (CS9310) が必要です。
  • 呼び出しサイト (CS9340CS9341) で使用されるオペランド型の一致する演算子をコンパイラが見つけられるように、パラメーター型を修正するか、不足している演算子オーバーロードを追加します。 該当する演算子が存在しない場合、コンパイラは不一致の診断に役立つ最も近い候補を表示します。
  • 呼び出しサイトで明示的なキャストを追加するか、より具体的なオーバーロードを提供して、複数の演算子オーバーロードが等しく一致する場合にあいまいさを排除します (CS9342)。

Important

静的二項演算子と対応するインスタンス複合代入演算子のシグネチャ要件は異なります。 署名が目的の宣言と一致していることを確認します。

演算子宣言の要件

  • CS0558: ユーザー定義演算子は、静的およびパブリックとして宣言する必要があります。
  • CS0715: 静的クラスにユーザー定義演算子を含めることはできません。
  • CS1037: オーバーロード可能な演算子が必要です。
  • CS1553: 宣言が有効ではありません。その代わりに、'modifier 演算子 <dest-type> (...' を使用してください。
  • CS9308: ユーザー定義演算子はパブリックとして宣言する必要があります。

この言語には、演算子宣言の特定の修飾子と構文が必要です。 完全なルールについては、演算子のオーバーロードユーザー定義の変換演算子を参照してください。

  • 演算子宣言 (staticpublic) に、修飾子と修飾子の両方を追加します。 C# 言語では、すべてのユーザー定義演算子が静的でパブリックである必要があるため、インスタンスなしでアクセスして呼び出すことができます。
  • 静的クラスから非静的クラスまたは構造体 (CS0715) に演算子宣言を移動します。 静的クラスにはインスタンスを含めることはできません。そのため、ユーザー定義演算子は、その包含型のインスタンスで動作しますが、静的クラスでは意味がありません。
  • 無効な演算子シンボルを 、有効なオーバーロード可能な演算子 (CS1037) に置き換えます。 オーバーロードできるのは、言語で定義されている特定の演算子だけです。
  • public static implicit operator <dest-type>(<source-type> parameter)または public static explicit operator <dest-type>(<source-type> parameter) (CS1553) の必要な変換演算子の形式に従って構文を修正します。 コンパイラは、変換演算子が特定の宣言パターンに従うことを想定しています。

静的抽象インターフェイスでの演算子の明示的なインターフェイス実装に関連するエラーについては、 静的抽象および仮想インターフェイス メンバー エラーを参照してください。

アクセシビリティに一貫性がない

  • CS0056: アクセシビリティに一貫性がありません。戻り値の型 'type' は、演算子 'operator' よりもアクセシビリティが低くなります。
  • CS0057: アクセシビリティに一貫性がありません。パラメーター型 'type' は、演算子 'operator' よりもアクセシビリティが低くなります。

パブリック オペレーターのシグネチャで使用されるすべての型は、少なくとも演算子自体と同じくらいアクセス可能である必要があります。 完全な規則については、C# 仕様 のアクセス修飾子アクセシビリティの制約 に関するページを参照してください。

  • 戻り値の型を、少なくとも演算子と同じアクセス可能な型に変更するか、戻り値の型 (CS0056) と一致するように演算子のアクセシビリティを低下させます。 アセンブリ外の呼び出し元は結果を使用できないため、 public 演算子は戻り値を介してアクセスできない型を公開できません。
  • パラメーター型を、少なくとも演算子と同じアクセス可能な型に変更するか、パラメーター型 (CS0057) に一致するように演算子のアクセシビリティを低下させます。 アセンブリの外部の呼び出し元は引数を指定できないため、 public 演算子では、アクセスできない型をパラメーターとして必要とすることはできません。

ユーザー定義の変換制限

  • CS0552: インターフェイスへのまたはインターフェイスからのユーザー定義変換。
  • CS0553: 基底クラスに対するユーザー定義の変換。
  • CS0554: 派生クラスへの、または派生クラスからのユーザー定義の変換。
  • CS0555: ユーザー定義演算子は、外側の型のオブジェクトを受け取って、外側の型のオブジェクトに変換することはできません。
  • CS0556: ユーザー定義の変換は、囲んでいる型に変換するか、または囲んでいる型から変換する必要があります。
  • CS0557: 型のユーザー定義変換が重複しています。

C# 言語では、ユーザー定義の変換に参加できる型が制限されます。 完全なルールについては、C# 仕様 のユーザー定義変換演算子変換演算子 に関するページを参照してください。

  • インターフェイス型 (CS0552) との間で変換する変換演算子を削除します。 インターフェイス変換は型システムの参照変換とボックス化によって処理されるため、この言語では、インターフェイス型に関連するユーザー定義の変換が禁止されています。 代わりに、明示的なインターフェイス実装またはヘルパー メソッドを使用してください。
  • 基底クラス (CS0553) との間で変換する変換演算子を削除します。 型とその基底クラス間の変換は、暗黙的な参照変換 (アップキャスト) と明示的な参照変換 (ダウンキャスト) によって既に存在するため、ユーザー定義の変換ではあいまいさが生まれます。
  • 派生クラス (CS0554) との間で変換する変換演算子を削除します。 基底クラスの変換と同様に、型とその派生型の間の変換は継承によって言語に組み込まれており、ユーザー定義の変換はそれらの変換と競合します。
  • 外側の型をそれ自体に変換する変換演算子 (CS0555) を削除します。 すべての型には、それ自体への暗黙的な ID 変換が既に存在するため、型から同じ型へのユーザー定義の変換は冗長であり、許可されません。
  • 変換演算子のいずれかの型を変更して、変換元または変換先の型が外側の型 (CS0556) になるようにします。 ユーザー定義の変換には、それを宣言する型が含まれている必要があります。3 番目の型では、関連のない 2 つの外部型間の変換を定義することはできません。
  • 重複する変換演算子を削除するか、重複する演算子の 1 つを変更して、変換元と変換先の種類が他の型と異なるようにします (CS0557)。 1 つの型で宣言できる暗黙的な変換と明示的な変換は、指定されたソース型と変換先の型のペアに対して 1 つだけです。

ブール演算子と短絡演算子

  • CS0215: 演算子 true または false の戻り値の型はブール値である必要があります。
  • CS0216: 演算子には、一致する演算子も定義する必要があります。
  • CS0217: ショートサーキット演算子として適用するには、ユーザー定義論理演算子の戻り値の型が 2 つのパラメーターの型と同じである必要があります。
  • CS0218: 型には、演算子 true と演算子 false の宣言が含まれている必要があります。

C# 言語では、ブール演算子と短絡評価用の特定のペアリングとシグネチャが必要です。 完全なルールについては、C# 仕様の true 演算子と false 演算子ブール論理演算子およびユーザー定義の条件付き論理演算子 を参照してください。

  • operator trueoperator falseの戻り値の型を bool (CS0215) に変更します。 これらの演算子は、値が論理的に true か false かを判断するため、言語では boolを返す必要があります。
  • 一致するペア演算子 (CS0216) を定義します。 この言語では、operator ==を使用したoperator !=operator <operator >operator <=を使用したoperator >=operator trueを使用したoperator falseなど、一部の演算子をペアで宣言する必要があります。
  • ユーザー定義の & または | 演算子の戻り値の型を、両方のパラメーター型に一致するように変更します (CS0217)。 短絡評価 (&&||) の場合、コンパイラでは、 & 演算子または | 演算子の戻り値の型、両方のパラメーター型、および包含型がすべて同じ型である必要があります。
  • operator true宣言とoperator false宣言の両方を型に追加します (CS0218)。 コンパイラは、&&||、対応するoperator trueまたはoperator false演算子を使用して&|を書き換えるので、ショートサーキット評価を機能させるには、3 つすべてが存在する必要があります。

チェックされた演算子

  • CS9023: 演算子をチェックされるように設定できません
  • CS9024: 演算子をオフにすることはできません
  • CS9025: Checked 演算子では、一致するチェックされていないバージョンも宣言する必要があります
  • CS9027: 想定外のキーワード 'unchecked'

checkedキーワードとuncheckedキーワードは、特定の演算子宣言にのみ適用できます。 完全なルールについては、「 算術演算子 」および 「ユーザー定義のチェック演算子」を参照してください。

  • サポートされていない演算子 (checked) からuncheckedまたはキーワードを削除します。 チェック/オフのバリアントをサポートするのは、算術演算子 +-*/++--、および明示的な変換演算子のみです。 比較演算子や等値演算子などの他の演算子は、個別のオーバーフロー動作を持たないので、チェックまたはオフにすることはできません。
  • 一致するチェックされていないバージョンの演算子 (CS9025) を追加します。 checked演算子はオーバーフロースロー動作を提供しますが、コンパイラは、uncheckedコンテキストで使用し、どちらのコンテキストも指定されていない場合の既定値として、対応するチェックされていないバージョンも必要です。
  • 無効な位置 (unchecked) から キーワードを削除します。 演算子宣言の unchecked キーワードは、演算子構文の一部としてのみ有効です (たとえば、 public static explicit operator unchecked int(MyType t))。 宣言内の別の場所に配置すると、構文エラーが発生します。

インターフェイスと継承の要件

  • CS9311: 型はインターフェイス メンバーを実装しません。型の 1 つが演算子でないため、メンバーを実装できません
  • CS9312: 型は、そのうちの 1 つが演算子ではないので、継承されたメンバーをオーバーライドできません
  • CS9313: オーバーロードされた複合代入演算子は 1 つのパラメーターを受け取ります

コンパイラは、演算子宣言と、実装またはオーバーライドするインターフェイス メンバーまたは基底クラス メンバーの間で厳密な一致を強制します。 完全なルールについては、演算子のオーバーロードとインターフェイスに関するセクションを参照してください。

  • 実装メンバーを、インターフェイスの演算子メンバーと一致する演算子宣言に変更するか、実装メンバーがメソッド (CS9311) の場合はインターフェイス メンバーをメソッドに変更します。 演算子は、演算子としても宣言されているインターフェイス メンバーのみを実装できます。通常のメソッドでは演算子コントラクトを満たすことはできません。その逆も同様です。
  • オーバーライドするメンバーを、基底クラスの演算子メンバーと一致する演算子宣言に変更するか、派生クラス メンバーがメソッド (CS9312) の場合は基底クラスメンバーをメソッドに変更します。 インターフェイスの実装と同様に、オーバーライドはオーバーライドされるメンバーの種類と一致する必要があります。演算子は非演算子メンバーをオーバーライドできません。
  • 複合代入演算子の宣言を変更して、パラメーターを 1 つだけ受け取ります (CS9313)。 複合代入演算子は、左オペランドが暗黙的に thisインスタンス メンバーであるため、右側のオペランドのみがパラメーターとして宣言されます。

等値演算子

  • CS0659: 'class' は Object.Equals(object o) をオーバーライドしますが、Object.GetHashCode() をオーバーライドしません
  • CS0660: 型は演算子 == または演算子 != を定義しますが、Object.Equals(object o) をオーバーライドしません
  • CS0661: 型は演算子 == または演算子 != を定義しますが、Object.GetHashCode() をオーバーライドしません

コンパイラでは、等値関連のオーバーライドと演算子の定義が同期された状態を維持する必要があります。 Object.Equals をオーバーライドしたり、 operator == / operator !=を定義したりする場合は、関連するオーバーライドも指定する必要があります。 完全なルールについては、「型と等値演算子の値の等価性を定義する方法」を参照してください。

  • Object.Equals をオーバーライドするときに、Object.GetHashCode のオーバーライドを追加します (CS0659)。 Dictionary<TKey,TValue>HashSet<T>などのハッシュ ベースのコレクションは、等しい 2 つのオブジェクトが同じハッシュ コードを返す必要があるコントラクトに依存します。 一致する GetHashCode オーバーライドがないと、等しいと比較されるオブジェクトが異なるバケットにハッシュされ、検索と重複除去が自動的に失敗する可能性があります。
  • Object.Equalsまたはoperator == (operator !=) を定義するときに、のオーバーライドを追加します。 多くのフレームワーク API、LINQ メソッド、コレクション操作など、 Equals を直接呼び出すコードでは、カスタム演算子は使用されません。 一貫性のある Equals オーバーライドがないと、同じ 2 つのオブジェクトが == によって等しいと見なされる可能性がありますが、 Equalsでは同じでないと見なされ、予期しない動作が発生する可能性があります。
  • Object.GetHashCodeまたはoperator == (operator !=) を定義するときに、のオーバーライドを追加します。 CS0659 と同様に、等価セマンティクスと一致する必要があります。 operator ==が 2 つのオブジェクトが等しいと見なしても、異なるハッシュ コードを返す場合、ハッシュベースのコレクションは正しく機能しません。

オーバーフローエラーとアンダーフロー エラー

  • CS0031: 定数値 'value' を 'type' に変換できません
  • CS0220: チェック モードでコンパイル時に操作がオーバーフローする
  • CS0221: 定数値 'value' を 'type' に変換できません ('unchecked' 構文を使用してオーバーライドします)
  • CS0463: 10 進定数式の評価がエラー 'error' により失敗しました
  • CS0543: 'enumeration' : 列挙子の値が大きすぎて型に収まらない
  • CS0594: 浮動小数点定数が型 'type' の範囲外です
  • CS0652: 整数定数との比較は役に立ちません。定数は型 'type' の範囲外です
  • CS1021: 整数定数が大きすぎます
  • CS8778: 定数値 'value' は実行時に 'type' をオーバーフローする可能性があります ('unchecked' 構文を使用してオーバーライドします)
  • CS8973: 実行時に操作がオーバーフローする可能性があります (オーバーライドには 'unchecked' 構文を使用します)

コンパイラはコンパイル時に定数式を評価し、値がターゲット型の有効範囲を超えたときにエラーまたは警告を報告します。 完全なルールについては、 チェックされたステートメントとチェックされていないステートメント整数型を参照してください。

  • 定数値をターゲット型の範囲内に収まる値に変更するか、ターゲットを大きな数値型 (CS0031) に変更します。 コンパイラは、 256byte (範囲 0 ~ 255) に割り当てるなど、適合しない定数を暗黙的に絞り込むことはありません。このエラーが発生します。 切り捨てが意図的な場合は、unchecked コンテキストで明示的なキャストを使用します。
  • 定数式の算術演算を修正して、結果がターゲット型に適合するようにするか、 式をオフの コンテキストでラップしてサイレント オーバーフローを許可します (CS0220)。 コンパイラは、既定でチェックされたコンテキストでコンパイル時に定数式全体を評価するため、型の範囲を超える中間または最終的な結果によってこのエラーが発生します。
  • 変換が有効になるように定数値またはターゲット型を変更するか、意図的に切り捨てられた結果が必要な場合は unchecked コンテキストで式をラップします (CS0221)。 CS0220 とは異なり、このエラーは、ソース値が変換先の型に適合しない明示的な定数変換に適用されます。
  • decimal型 (decimal) の範囲内に収まるように、定数式を簡略化または分割します。 decimal型の最大値は約 $7.9 \times 10^{28}$ と 28 ~ 29 桁で、コンパイラはコンパイル時に完全な式を評価します。
  • 列挙型のメンバー値を列挙型の基になる型に適合するものに変更するか、基になる型を大きな整数型 (CS0543) に変更します。 既定では、列挙型は基になる型として int を使用します。 メンバーの値が基になる型の範囲を超える場合は、 longのような大きな型を指定します。
  • 浮動小数点定数をターゲット型の範囲内の値に変更するか、double (float) ではなく、などの高い精度の型を使用します。 float型は、最大約 $3.4 \times 10^{38}$ までの値をサポートし、doubleは最大で約 $1.7 \times 10^{308}$ をサポートします。
  • 定数が変数の型 (CS0652) の範囲内になるように、比較を削除または修正します。 たとえば、 byte 変数を 300と比較すると、true になることは決してないため、コンパイラは比較が役に立たないと警告します。 この警告は、多くの場合、変数の型と目的の値の範囲の間でロジック エラーまたは不一致を示します。
  • より大きな数値型を使用するか、複数の操作で値を分割します (CS1021)。 このエラーは、整数リテラルが最大整数型 (ulong、最大 $1.8 \times 10^{19}$) の範囲を超えた場合に発生します。 その範囲を超える値については、 BigIntegerの使用を検討してください。
  • unchecked コンテキストで式をラップして警告を抑制するか、ターゲット型の範囲内に収まるように値を変更します (CS8778)。 この警告は、実行時にデータが失われる可能性のある一定の変換を示します。コンパイラはオーバーフローが確実に発生することを証明できませんが、リスクを識別します。
  • unchecked コンテキストで式をラップして警告を抑制するか、オーバーフローの可能性を回避するために算術を再構築します (CS8973)。 この警告は CS8778 に似ていますが、変換ではなく算術演算に適用されます。コンパイラは、実行時に操作がオーバーフローする可能性があることを検出します。