Freigeben über


Beheben von Fehlern und Warnungen für Operatordeklarationen und Überlauf

Dieser Artikel behandelt die folgenden Compiler-Fehler und -Warnungen:

  • CS0031: Konstanter Wert 'value' kann nicht in einen 'Typ' konvertiert werden.
  • CS0056: Inkonsistente Zugänglichkeit: Rückgabetyp 'type' ist weniger zugänglich als Operator 'operator'
  • CS0057: Inkonsistente Barrierefreiheit: Parametertyp "type" ist weniger zugänglich als operator "operator"
  • CS0215: Der Rückgabetyp des Operators "True" oder "False" muss bool sein.
  • CS0216: Der Operator "operator" erfordert, dass auch ein übereinstimmende Operator "missing_operator" definiert werden muss.
  • CS0217: Um als Kurzschlussoperator anwendbar zu sein, muss ein benutzerdefinierter logischer Operator ('Operator') den gleichen Rückgabetyp aufweisen wie der Typ seiner 2 Parameter.
  • CS0218: Der Typ ("Typ") muss Deklarationen des Operators "true" und "operator false" enthalten.
  • CS0220: Der Vorgang überläuft während der Kompilierung im überprüften Modus
  • CS0221: Konstantenwert 'value' kann nicht in einen 'Typ' konvertiert werden (verwenden Sie die Syntax "deaktiviert" zum Außerkraftsetzen).
  • CS0448: Der Rückgabetyp für ++ oder -- Operator muss der enthaltende Typ oder vom enthaltenden Typ abgeleitet sein.
  • CS0463: Fehler bei der Auswertung des Dezimalkonstantenausdrucks: "error"
  • CS0543: 'enumeration': Der Enumerationswert ist zu groß, um in den Typ einzupassen.
  • CS0552: "Konvertierungsroutine" : benutzerdefinierte Konvertierung in/von der Schnittstelle
  • CS0553: "Konvertierungsroutine" : benutzerdefinierte Konvertierung in/von der Basisklasse
  • CS0554: "Konvertierungsroutine" : benutzerdefinierte Konvertierung in/von abgeleiteter Klasse
  • CS0555: Benutzerdefinierter Operator kann kein Objekt des eingeschlossenen Typs übernehmen und in ein Objekt des eingeschlossenen Typs konvertieren.
  • CS0556: Benutzerdefinierte Konvertierung muss von oder zu dem umschließenden Typ erfolgen.
  • CS0557: Doppelte benutzerdefinierte Konvertierung im Typ
  • CS0558: Benutzerdefinierter Operator muss statisch und öffentlich deklariert werden.
  • CS0559: Der Parametertyp für ++ oder -- Operator muss der enthaltende Typ sein.
  • CS0562: Der Parameter eines unären Operators muss der enthaltende Typ sein.
  • CS0563: Einer der Parameter eines binären Operators muss der enthaltende Typ sein.
  • CS0564: Der erste Operand eines überladenen Schichtoperators muss den gleichen Typ wie der enthaltende Typ aufweisen, und der Typ des zweiten Operanden muss int sein.
  • CS0567: Schnittstellen dürfen keine Operatoren enthalten
  • CS0590: Benutzerdefinierte Operatoren können keine void zurückgeben
  • CS0594: Gleitkommakonstante liegt außerhalb des Bereichs vom Typ 'Typ'
  • CS0652: Vergleich mit integraler Konstante ist nutzlos; die Konstante liegt außerhalb des Bereichs vom Typ 'Typ'
  • CS0659: 'class' überschreibt Object.Equals(object o), jedoch nicht Object.GetHashCode()
  • CS0660: Typ definiert operator == oder operator !=, überschreibt jedoch nicht Object.Equals(object o)
  • CS0661: Typ definiert entweder operator == oder operator !=, überschreibt jedoch nicht Object.GetHashCode()
  • CS0715: Statische Klassen dürfen keine benutzerdefinierten Operatoren enthalten.
  • CS1021: Integralkonstante ist zu groß
  • CS1037: Überlastbarer Operator erwartet
  • CS1553: Die Deklaration ist ungültig; verwenden Sie "Modifiziereroperator <dest-type> (...' stattdessen
  • CS8930: Explizite Implementierung eines benutzerdefinierten Operators muss statisch deklariert werden.
  • CS8931: Benutzerdefinierte Konvertierung in einer Schnittstelle muss in oder aus einem Typparameter für den eingeschlossenen Typ konvertiert werden, der auf den eingeschlossenen Typ beschränkt ist.
  • CS8778: Konstanter Wert "value" kann zur Laufzeit den Wert "type" überlaufen (verwenden Sie die Syntax "deaktiviert" zum Überschreiben).
  • CS8973: Der Vorgang kann zur Laufzeit überlaufen (verwenden Sie die 'unchecked'-Syntax, um es zu überschreiben)
  • CS9023: Der Operator kann nicht überprüft werden.
  • CS9024: Der Operator kann nicht deaktiviert werden.
  • CS9025: Der Operator erfordert, dass auch eine übereinstimmende, nicht überprüfte Version deklariert wird.
  • CS9027: Unerwartetes Schlüsselwort "deaktiviert".
  • CS9308: Benutzerdefinierter Operator muss öffentlich deklariert werden.
  • CS9310: Der Rückgabetyp für diesen Operator muss ungültig sein.
  • CS9311: Der Typ implementiert kein Schnittstellenmitglied. Der Typ kann das Mitglied nicht implementieren, da einer von ihnen kein Operator ist.
  • CS9312: Der Typ kann das geerbte Element nicht außer Kraft setzen, da einer davon kein Operator ist.
  • CS9313: Der überladene zusammengesetzte Zuweisungsoperator verwendet einen Parameter.
  • CS9340: Der Operator kann nicht auf Operanden angewendet werden. Der nächstgelegene nicht anwendbare Kandidat wird angezeigt.
  • CS9341: Der Operator kann nicht auf den Operanden angewendet werden. Es wird der nächstgelegene ungeeignete Kandidat angezeigt.
  • CS9342: Die Operatorauflösung ist zwischen den folgenden Membern mehrdeutig.

Anforderungen an die Operatorsignatur

  • CS0448: Der Rückgabetyp für ++ oder -- Operator muss der enthaltende Typ oder vom enthaltenden Typ abgeleitet sein.
  • CS0559: Der Parametertyp für ++ oder -- Operator muss der enthaltende Typ sein.
  • CS0562: Der Parameter eines unären Operators muss der enthaltende Typ sein.
  • CS0563: Einer der Parameter eines binären Operators muss der enthaltende Typ sein.
  • CS0564: Der erste Operand eines überladenen Schichtoperators muss den gleichen Typ wie der enthaltende Typ aufweisen, und der Typ des zweiten Operanden muss int sein.
  • CS0567: Schnittstellen dürfen keine Operatoren enthalten.
  • CS0590: Benutzerdefinierte Operatoren können keine void zurückgeben.
  • CS9310: Der Rückgabetyp für diesen Operator muss ungültig sein.
  • CS9340: Der Operator kann nicht auf die Operanden angewendet werden. Der am nächsten liegende nicht anwendbare Kandidat wird angezeigt.
  • CS9341: Der Operator kann nicht auf den Operanden angewendet werden. Der nächste ungeeignete Kandidat wird angezeigt.
  • CS9342: Die Operatorauflösung ist zwischen den folgenden Membern mehrdeutig.

Jeder Operatortyp verfügt über spezifische Parameter- und Rückgabetypanforderungen, die durch die Sprachspezifikation definiert sind. Die vollständigen Regeln, für die Operatoren überladen werden können, finden Sie unter Operatorüberladungen und Operatoren in der C#-Spezifikation.

  • Ändern Sie den Rückgabetyp der Operatoren ++ oder -- auf den umschließenden Typ oder auf einen davon abgeleiteten Typ (CS0448). Die Sprache erfordert, dass Inkrement- und Dekrementoperatoren einen Wert zurückgeben, der kompatibel mit dem Typ ist, der sie enthält, damit das Ergebnis derselben Variablen erneut zugewiesen werden kann.
  • Ändern Sie den Parameter der ++- oder ---Operatoren auf den enthaltenen Typ (CS0559). Inkrementierungs- und Dekrementierungsoperatoren müssen auf Instanzen ihres eigenen Typs angewendet werden.
  • Ändern Sie den Parameter eines unären Operators in den enthaltenden Typ (CS0562). Unäre Operatoren müssen einen Operanden des Typs akzeptieren, der sie deklariert.
  • Stellen Sie sicher, dass mindestens ein Parameter eines binären Operators der enthaltende Typ (CS0563) ist. Binäre Operatoren müssen den deklarierenden Typ einbeziehen, damit der Compiler sie durch diesen Typ auflösen kann.
  • Ändern Sie den ersten Parameter eines Schichtoperators in den enthaltenden Typ und den zweiten Parameter in int (CS0564). Die Sprache definiert Schichtoperatoren mit einer bestimmten Signatur: den Typ, der verschoben wird, und einen ganzzahligen Schichtbetrag.
  • Verschieben von Operatordeklarationen aus Schnittstellen und in Klassen oder Strukturen (CS0567). Herkömmliche (nicht statische abstrakte) Operatordeklarationen sind in Schnittstellen nicht zulässig. Informationen zu statischen abstrakten Operatoren in Schnittstellen finden Sie unter "Static abstract" und "virtual interface member errors".
  • Ändern Sie den Rückgabetyp des Operators in einen Nicht-void-Typ (CS0590). Die meisten benutzerdefinierten Operatoren müssen einen Wert zurückgeben. Die Ausnahme ist zusammengesetzte Zuordnungsoperatoren, die einen void Rückgabetyp (CS9310) erfordern.
  • Korrigieren Sie die Parametertypen, oder fügen Sie fehlende Operatorüberladungen hinzu, damit der Compiler einen übereinstimmenden Operator für die an der Aufrufstelle verwendeten Operandtypen finden kann (CS9340, CS9341). Wenn kein anwendbarer Operator vorhanden ist, zeigt der Compiler den nächstbesten Kandidaten an, um die Nichtübereinstimmung zu diagnostizieren.
  • Fügen Sie explizite Umwandlungen an der Anrufwebsite hinzu, oder stellen Sie spezifischere Überladungen bereit, um Mehrdeutigkeit zu vermeiden, wenn mehrere Operatorüberladungen gleich gut übereinstimmen (CS9342).

Von Bedeutung

Die Signaturanforderungen für statische binäre Operatoren und die entsprechenden Verbundzuordnungsoperatoren der Instanz unterscheiden sich. Stellen Sie sicher, dass die Signatur der gewünschten Deklaration entspricht.

Anforderungen an die Operatordeklaration

  • CS0558: Benutzerdefinierter Operator muss statisch und öffentlich deklariert werden.
  • CS0715: Statische Klassen dürfen keine benutzerdefinierten Operatoren enthalten.
  • CS1037: Überlastbarer Operator erwartet.
  • CS1553: Die Deklaration ist ungültig; verwenden Sie den Modifiziereroperator <dest-type> (...) stattdessen.
  • CS9308: Benutzerdefinierter Operator muss öffentlich deklariert werden.

Für die Sprache sind spezifische Modifizierer und Syntax für Operatordeklarationen erforderlich. Die vollständigen Regeln finden Sie unter Operatorüberladungen und benutzerdefinierte Konvertierungsoperatoren.

  • Fügen Sie sowohl die Modifizierer static und public zur Operatordeklaration (CS0558, CS9308) hinzu. Für die C#-Sprache müssen alle benutzerdefinierten Operatoren statisch und öffentlich sein, sodass sie ohne Instanz zugänglich und aufgerufen werden können.
  • Verschieben Sie die Operatordeklaration aus einer statischen Klasse in eine nicht statische Klasse oder Struktur (CS0715). Statische Klassen können keine Instanzen aufweisen, daher sind benutzerdefinierte Operatoren, die auf Instanzen ihres enthaltenden Typs arbeiten, in statischen Klassen nicht aussagekräftig.
  • Ersetzen Sie das ungültige Operatorsymbol durch einen gültigen überladenen Operator (CS1037). Nur bestimmte Operatoren, die von der Sprache definiert sind, können überladen werden.
  • Korrigieren Sie die Syntax, um dem erforderlichen Konvertierungsoperatorformular zu folgen: public static implicit operator <dest-type>(<source-type> parameter) oder public static explicit operator <dest-type>(<source-type> parameter) (CS1553). Der Compiler erwartet, dass Konvertierungsoperatoren einem bestimmten Deklarationsmuster folgen.

Fehler im Zusammenhang mit expliziten Schnittstellenimplementierungen von Operatoren in statischen abstrakten Schnittstellen finden Sie unter Static abstract and virtual interface member errors.

Inkonsistente Barrierefreiheit

  • CS0056: Inkonsistente Zugänglichkeit: Der Rückgabetyp 'Typ' ist weniger zugänglich als der Operator 'Operator'.
  • CS0057: Inkonsistente Barrierefreiheit: Der Parametertyp "type" ist weniger zugänglich als der Operator "operator".

Alle Typen, die in der Signatur eines öffentlichen Operators verwendet werden, müssen mindestens so zugänglich sein wie der Operator selbst. Die vollständigen Regeln finden Sie unter Access-Modifizierer und Barrierefreiheitseinschränkungen in der C#-Spezifikation.

  • Ändern Sie den Rückgabetyp in einen Typ, der mindestens so barrierefrei wie der Operator ist, oder verringern Sie die Barrierefreiheit des Operators, um dem Rückgabetyp (CS0056) zu entsprechen. Ein public Operator kann einen weniger zugänglichen Typ nicht über seinen Rückgabewert verfügbar machen, da Aufrufer außerhalb der Assembly das Ergebnis nicht verwenden können.
  • Ändern Sie den Parametertyp in einen Typ, der mindestens so zugänglich ist wie der Operator, oder reduzieren Sie die Zugänglichkeit des Operators, um sie an den Parametertyp anzupassen (CS0057). Ein public Operator kann keinen weniger zugänglichen Typ als Parameter erfordern, da Aufrufer außerhalb der Assembly das Argument nicht bereitstellen können.

Benutzerdefinierte Konvertierungseinschränkungen

  • CS0552: Benutzerdefinierte Konvertierung in/von der Schnittstelle.
  • CS0553: Benutzerdefinierte Konvertierung in/von Basisklasse.
  • CS0554: Benutzerdefinierte Konvertierung in/von abgeleiteter Klasse.
  • CS0555: Benutzerdefinierter Operator kann kein Objekt des eingeschlossenen Typs übernehmen und in ein Objekt des eingeschlossenen Typs konvertieren.
  • CS0556: Benutzerdefinierte Konvertierung muss in oder aus dem eingeschlossenen Typ konvertiert werden.
  • CS0557: Doppelte benutzerdefinierte Konvertierung im Typ.

Die C#-Sprache beschränkt, welche Typen an benutzerdefinierten Konvertierungen teilnehmen können. Die vollständigen Regeln finden Sie unter benutzerdefinierte Konvertierungsoperatoren und Konvertierungsoperatoren in der C#-Spezifikation.

  • Entfernen Sie den Konvertierungsoperator, der in einen oder aus einem Schnittstellentyp (CS0552) konvertiert wird. Die Sprache verbietet benutzerdefinierte Konvertierungen mit Schnittstellentypen, da Schnittstellenkonvertierungen über die Referenzkonvertierungen und Boxen des Typsystems verarbeitet werden. Verwenden Sie stattdessen explizite Schnittstellenimplementierungen oder Hilfsmethoden.
  • Entfernen Sie den Konvertierungsoperator, der in eine oder aus einer Basisklasse (CS0553) konvertiert wird. Konvertierungen zwischen einem Typ und seiner Basisklasse sind bereits durch implizite Verweiskonvertierungen (Upcast) und explizite Verweiskonvertierungen (Downcast) vorhanden, sodass eine benutzerdefinierte Konvertierung Mehrdeutigkeit erzeugen würde.
  • Entfernen Sie den Konvertierungsoperator, der in eine abgeleitete Klasse (CS0554) konvertiert oder daraus stammt. Wie Basisklassenkonvertierungen werden Konvertierungen zwischen einem Typ und den abgeleiteten Typen durch Vererbung in die Sprache integriert, und benutzerdefinierte Konvertierungen würden mit ihnen in Konflikt stehen.
  • Entfernen Sie den Konvertierungsoperator, der den eingeschlossenen Typ in sich selbst konvertiert (CS0555). Jeder Typ verfügt bereits über eine implizite Identitätskonvertierung in sich selbst, sodass eine benutzerdefinierte Konvertierung von einem Typ in denselben Typ redundant und nicht zulässig ist.
  • Ändern Sie einen der Typen im Konvertierungsoperator so, dass der Quell- oder Zieltyp der eingeschlossene Typ (CS0556) ist. Eine benutzerdefinierte Konvertierung muss den Typ umfassen, der ihn deklariert. Sie können keine Konvertierung zwischen zwei nicht verwandten externen Typen in einem dritten Typ definieren.
  • Entfernen Sie den Doppelten Konvertierungsoperator, oder ändern Sie einen der doppelten Operatoren, sodass sich die Quell- und Zieltypen von der anderen (CS0557) unterscheiden. Ein Typ kann nur eine implizite und eine explizite Konvertierung für ein bestimmtes Quell- und Zieltyppaar deklarieren.

Boolesche und Kurzschlussoperatoren

  • CS0215: Der Rückgabetyp des Operators "true" oder "false" muss bool sein.
  • CS0216: Der Operator erfordert auch die Definition eines übereinstimmenden Operators.
  • CS0217: Um als Kurzschlussoperator anwendbar zu sein, muss ein benutzerdefinierter logischer Operator den gleichen Rückgabetyp aufweisen wie der Typ seiner 2 Parameter.
  • CS0218: Der Typ muss Deklarationen des Operators "true" und "operator false" enthalten.

Für die C#-Sprache sind bestimmte Kopplungen und Signaturen für boolesche Operatoren und Kurzschlussauswertungen erforderlich. Die vollständigen Regeln finden Sie unter "true" und "false" operatoren, booleschen logischen Operatoren und benutzerdefinierten logischen Operatoren in der C#-Spezifikation.

  • Ändern Sie den Rückgabetyp von operator true und operator false in bool (CS0215). Diese Operatoren bestimmen, ob ein Wert logisch wahr oder falsch ist, sodass sie von der Sprache zurückgegeben boolwerden müssen.
  • Definieren sie den übereinstimmenden gekoppelten Operator (CS0216). Für die Sprache müssen bestimmte Operatoren in Paaren deklariert werden: operator == mit operator !=, operator < mit operator >, operator <= mit operator >= und operator true mit operator false.
  • Ändern Sie den Rückgabetyp des benutzerdefinierten & Oder | Operators so, dass er beiden Parametertypen (CS0217) entspricht. Für die Kurzschlussauswertung (&& und ||) erfordert der Compiler, dass der Rückgabetyp des &- oder |-Operators, beide Parametertypen und der enthaltende Typ alle denselben Typ haben.
  • Fügen Sie sowohl operator true als auch operator false Deklarationen zum Typ (CS0218) hinzu. Der Compiler überschreibt && und || mit operator true, operator false sowie dem entsprechenden &- oder |-Operator, sodass alle drei vorhanden sein müssen, damit die Kurzschlussauswertung funktioniert.

Überprüfte Operatoren

  • CS9023: Der Operator kann nicht überprüft werden.
  • CS9024: Operator kann nicht deaktiviert werden
  • CS9025: Der überprüfte Operator erfordert, dass auch eine übereinstimmende, nicht überprüfte Version deklariert wird.
  • CS9027: Unerwartetes Schlüsselwort "deaktiviert"

Die Schlüsselwörter checked und unchecked können nur auf bestimmte Operatordeklarationen angewendet werden. Die vollständigen Regeln finden Sie unter arithmetischen Operatoren und benutzerdefinierten überprüften Operatoren.

  • Entfernen Sie das Schlüsselwort checked oder unchecked aus einem nicht unterstützten Operator (CS9023, CS9024). Nur die arithmetischen Operatoren , , +, -, */, ++und explizite Konvertierungsoperatoren --unterstützen aktivierte und deaktivierte Varianten. Andere Operatoren, z. B. Vergleichs- oder Gleichheitsoperatoren, weisen kein eindeutiges Überlaufverhalten auf und können nicht markiert oder deaktiviert werden.
  • Fügen Sie eine übereinstimmende, nicht überprüfte Version des Operators (CS9025) hinzu. Ein checked-Operator bietet das Überlauf-Auslöseverhalten, aber der Compiler benötigt auch die entsprechende Unchecked-Version zur Verwendung in unchecked-Kontexten und als Standard, wenn kein Kontext angegeben ist.
  • Entfernen Sie das unchecked Schlüsselwort aus der ungültigen Position (CS9027). Das unchecked Schlüsselwort in einer Operatordeklaration ist nur als Teil der Operatorsyntax gültig (z. B public static explicit operator unchecked int(MyType t). ). Wenn sie an anderer Stelle in der Deklaration platziert wird, tritt ein Syntaxfehler auf.

Anforderungen an Schnittstellen und Vererbung

  • CS9311: Der Typ implementiert kein Schnittstellenmitglied. Der Typ kann das Mitglied nicht implementieren, weil eines von ihnen kein Operator ist.
  • CS9312: Typ kann geerbtes Element nicht außer Kraft setzen, da einer davon kein Operator ist.
  • CS9313: Überladener Verbundzuordnungsoperator akzeptiert einen Parameter.

Der Compiler erzwingt einen strengen Abgleich zwischen Operatordeklarationen und den Schnittstellenmitgliedern oder Basisklassenmitgliedern, die sie implementieren oder überschreiben. Die vollständigen Regeln finden Sie unter Operatorüberladungen und Schnittstellen.

  • Ändern Sie das implementierende Element in eine Operatordeklaration, die dem Operatormemm der Schnittstelle entspricht, oder ändern Sie das Schnittstellenelement in eine Methode, wenn das implementierende Element eine Methode ist (CS9311). Ein Operator kann nur ein Schnittstellenmememm implementieren, das auch als Operator deklariert ist. Sie können einen Operatorvertrag nicht mit einer regulären Methode erfüllen oder umgekehrt.
  • Ändern Sie das überschriebene Element in eine Operatordeklaration, die dem Operatormemm der Basisklasse entspricht, oder ändern Sie das Basisklassenmemmemm in eine Methode, wenn es sich bei dem abgeleiteten Klassenmememb um eine Methode (CS9312) handelt. Wie bei der Schnittstellenimplementierung muss eine Überschreibung mit der Art des überschriebenen Mitglieds übereinstimmen. Ein Operator kann ein Nicht-Operator-Mitglied nicht überschreiben.
  • Ändern Sie die Deklaration des Zusammengesetzten Zuordnungsoperators so, dass genau ein Parameter (CS9313) akzeptiert wird. Zusammengesetzte Zuordnungsoperatoren sind Instanzenmember, bei denen der linke Operand implizit thisist, sodass nur der rechte Operand als Parameter deklariert wird.

Gleichheitsoperatoren

  • CS0659: 'class' überschreibt Object.Equals(object o), jedoch nicht Object.GetHashCode()
  • CS0660: Der Typ definiert den Operator == oder den Operator !=, überschreibt jedoch nicht Objekt.Equals(Objekt o)
  • CS0661: Type definiert den Operator == oder Operator != aber überschreibt Object.GetHashCode() nicht.

Der Compiler verlangt, dass gleichheitsbezogene Überschreibungen und Operatordefinitionen synchronisiert bleiben. Wenn Sie Object.Equals überschreiben oder operator == / operator != definieren, müssen Sie auch die zugehörigen Überschreibungen bereitstellen. Die vollständigen Regeln finden Sie unter Definieren der Wertgleichstellung für einen Typ - und Gleichheitsoperatoren.

  • Fügen Sie eine Überschreibung von Object.GetHashCode hinzu, wenn Sie Object.Equals überschreiben (CS0659). Hashbasierte Auflistungen wie Dictionary<TKey,TValue> und HashSet<T> basieren auf der Anforderung, dass zwei gleichwertige Objekte denselben Hashcode zurückgeben müssen. Ohne eine übereinstimmende GetHashCode Überschreibung können Objekte, die als gleich verglichen werden, unterschiedlich in Eimer gehasht werden, wodurch Suchen und Deduplizierung unbemerkt fehlschlagen.
  • Fügen Sie eine Überschreibung von Object.Equals hinzu, wenn Sie operator == oder operator != definieren (CS0660). Code, das Equals direkt aufruft—including viele Framework-APIs, LINQ-Methoden und Sammlungsvorgänge—verwendet nicht Ihren benutzerdefinierten Operator. Ohne eine konsistente Equals Überschreibung könnten dieselben beiden Objekte möglicherweise von == als gleich angesehen, aber nicht von Equals als gleich angesehen werden, was zu unvorhersehbarem Verhalten führen kann.
  • Eine Außerkraftsetzung von Object.GetHashCode hinzufügen, wenn Sie operator == oder operator != (CS0661) definieren. Wie CS0659 brauchen GetHashCode Sie Konsistenz in Ihrer Gleichheitssemantik. Wenn operator == zwei Objekte als gleich betrachtet, sie aber unterschiedliche Hashcodes zurückgeben, funktionieren hashbasierte Auflistungen nicht ordnungsgemäß.

Überlauf- und Unterlauffehler

  • CS0031: Konstanter Wert 'value' kann nicht in einen 'Typ' konvertiert werden.
  • CS0220: Der Vorgang überläuft zur Kompilierungszeit im überprüften Modus
  • CS0221: Konstantenwert 'value' kann nicht in einen 'Typ' konvertiert werden (verwenden Sie die Syntax "deaktiviert" zum Außerkraftsetzen).
  • CS0463: Fehler bei der Auswertung des Dezimalkonstantenausdrucks: "error"
  • CS0543: 'enumeration': Der Enumerationswert ist zu groß, um in den Typ einzupassen.
  • CS0594: Gleitkommakonstante liegt außerhalb des Bereichs vom Typ 'Typ'
  • CS0652: Vergleich mit integraler Konstante ist nutzlos; die Konstante liegt außerhalb des Bereichs vom Typ 'Typ'
  • CS1021: Integralkonstante ist zu groß
  • CS8778: Konstanter Wert "value" kann zur Laufzeit den Typ "type" überlaufen (verwenden Sie die Syntax "unchecked" zum Überschreiben).
  • CS8973: Der Vorgang kann zur Laufzeit überlaufen (verwenden Sie die 'unchecked'-Syntax, um dies zu umgehen)

Der Compiler wertet konstanten Ausdrücke zur Kompilierungszeit aus und meldet Fehler oder Warnungen, wenn ein Wert den gültigen Bereich seines Zieltyps überschreitet. Die vollständigen Regeln finden Sie unter aktivierten und deaktivierten Anweisungen und Integraltypen.

  • Ändern Sie den Konstantenwert in einen Wert, der in den Bereich des Zieltyps passt, oder ändern Sie das Ziel in einen größeren numerischen Typ (CS0031). Der Compiler kann eine Konstante nicht implizit einschränken, die nicht in den Bereich passt – indem 256 einem byte zugewiesen wird, dessen Bereich von 0 bis 255 reicht, wird dieser Fehler ausgelöst. Wenn die Abkürzung beabsichtigt ist, verwenden Sie eine explizite Umwandlung in einem unchecked Kontext.
  • Korrigieren Sie die Arithmetik im konstanten Ausdruck so, dass das Ergebnis dem Zieltyp entspricht, oder umschließen Sie den Ausdruck in einem unchecked Kontext, um den stillen Überlauf (CS0220) zuzulassen. Der Compiler wertet den gesamten Konstantenausdruck zur Kompilierungszeit in einem überprüften Kontext standardmäßig aus, sodass zwischene oder endgültige Ergebnisse, die den Bereich des Typs überschreiten, diesen Fehler verursachen.
  • Ändern Sie den Konstantenwert oder den Zieltyp so, dass die Konvertierung gültig ist, oder schließen Sie den Ausdruck in einen unchecked Kontext um, wenn Sie absichtlich das abgeschnittene Ergebnis (CS0221) wünschen. Im Gegensatz zu CS0220 gilt dieser Fehler für explizite Konstantenkonvertierungen, bei denen der Quellwert nicht dem Zieltyp entspricht.
  • Vereinfachen oder trennen Sie den decimal konstanten Ausdruck, sodass er innerhalb des Bereichs und der Genauigkeit des decimal Typs (CS0463) bleibt. Der decimal Typ hat einen Höchstwert von ca. $7{,}9 \times 10^{28}$ und 28 bis 29 signifikante Ziffern, und der Compiler wertet den vollständigen Ausdruck zur Kompilierungszeit aus.
  • Ändern Sie den Enumerationsmitgliedswert in einen Wert, der in den zugrunde-liegenden Enumerationstyp passt, oder ändern Sie den zugrunde-liegenden Typ in einen größeren integralen Typ (CS0543). Standardmäßig verwenden Enumeratoren int als zugrunde liegenden Typ. Wenn der Wert eines Elements den Bereich des zugrunde liegenden Typs überschreitet, geben Sie einen größeren Typ an, wie z. B. long.
  • Ändern Sie die Gleitkommakonstante in einen Wert innerhalb des Bereichs des Zieltyps, oder verwenden Sie einen Typ mit höherer Genauigkeit, wie z. B. double anstelle von float (CS0594). Der float Typ unterstützt Werte bis zu ca. 3,4 $ \times 10^{38}$, und double unterstützt bis zu ca. 1,7 $ \times 10^{308}$.
  • Entfernen oder korrigieren Sie den Vergleich, sodass sich die Konstante innerhalb des Bereichs des Typs der Variablen (CS0652) befindet. Der Vergleich einer byte Variablen mit 300beispielsweise kann nie wahr sein, sodass der Compiler warnt, dass der Vergleich nutzlos ist. Diese Warnung weist häufig auf einen Logischen Fehler oder einen Konflikt zwischen dem Variablentyp und dem beabsichtigten Wertebereich hin.
  • Verwenden Sie einen größeren numerischen Typ, oder teilen Sie den Wert über mehrere Vorgänge hinweg (CS1021). Dieser Fehler tritt auf, wenn ein ganzzahliges Literal den Bereich des größten möglichen integralen Typs überschreitet (bis zu ulong, $1,8 \times 10^{{19}}$). Für Werte, die über diesen Bereich hinausgehen, sollten Sie die Verwendung in Betracht ziehen BigInteger.
  • Umschließen Sie den Ausdruck in einem unchecked Kontext, um die Warnung zu unterdrücken, oder ändern Sie den Wert so, dass er in den Bereich des Zieltyps (CS8778) passt. Diese Warnung gibt eine konstante Konvertierung an, die zur Laufzeit Möglicherweise Daten verliert . Der Compiler kann den Überlauf definitiv nicht nachweisen, aber es identifiziert das Risiko.
  • Umschließen Sie den Ausdruck in einem unchecked Kontext, um die Warnung zu unterdrücken, oder strukturieren Sie die Arithmetik, um potenziellen Überlauf (CS8973) zu vermeiden. Diese Warnung ähnelt CS8778 , gilt jedoch für arithmetische Vorgänge anstelle von Konvertierungen. Der Compiler erkennt, dass der Vorgang zur Laufzeit überlaufen kann.