Laden...

[erledigt] Der Operator "==" kann nicht auf Operanden vom Typ "X" und "X" angewendet werden.

Erstellt von Regenwurm vor 13 Jahren Letzter Beitrag vor 13 Jahren 8.011 Views
R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 13 Jahren
[erledigt] Der Operator "==" kann nicht auf Operanden vom Typ "X" und "X" angewendet werden.

Hallo,

Ich will 2 structs auf Gleichheit überprüfen und bekomme folgende Fehlermeldung:

Der Operator "==" kann nicht auf Operanden vom Typ "DjikstraAlgorithmGUI.WayPoint" und "DjikstraAlgorithmGUI.WayPoint" angewendet werden.

Ich habe eine globale List<WayPoints>.
Jeder WayPoint hat als Attribut eine weitere List<WayPoints> um zu sehen mit welchem Punkt er bereits "verbunden" ist:

    struct WayPoint
    {
        /* .... */

        public List<WayPoint> Connected;
    }

Liegt das Problem vielleicht darin begraben?

Gruss,
Regenwurm

ServiceStack & Angular = =)

Gelöschter Account
vor 13 Jahren

Was ist daran komisch???
Du kannst nicht ohne weiteres den == Operator auf ein struct anwenden.
Natürlich gibts Compare und Co...

Schau mal hier
http://dotnetpulse.blogspot.com/2008/01/how-to-support-and-operations-for-c.html

1.130 Beiträge seit 2007
vor 13 Jahren

klassen instanzen gibt es jeweils nur einmal im speicher. variablen sind nur refewrenzen. == vergleicht bei klassen die referenzen (also ob auf den gleichen Speicher verwiesen wird)

bei structs mach das aber keinen sinn, da sie dauernd kopiert werden.

wenn du trotzdem vergleichen willst, musst du entweder objekt.equals nehmen (vorsicht, ziemlich langsam) oder dir den operator selbst definieren:

public static bool operator ==(Waypoint A,Waypoint B)
{
   return A.iwas==B.iwas&&...;
}

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

U
282 Beiträge seit 2008
vor 13 Jahren

Ich benötige öfters IDs, das sind eigentlich nur typsichere Strings. Also ein Struct, was intern einen String beinhaltet und zur Identifikation von Objekten dient.
Die will ich auch vergleichen oder als Keys in Dictionaries nehmen können.

Eine Standardimplementierung (hier für IDs für Dimensionen) ist


using System;

    [Serializable]
    public struct DimensionId {
        private readonly string value;

        public static bool operator !=(DimensionId id1, DimensionId id2) {
            return !(id1 == id2);
        }

        public static bool operator ==(DimensionId id1, DimensionId id2) {
            return id1.value == id2.value;
        }

        public DimensionId(string value) {
            this.value = value;
        }

        public override bool Equals(object obj) {
            return (obj is DimensionId) && (this == (DimensionId)obj);
        }

        public override int GetHashCode() {
            return value == null ? 0 : value.GetHashCode();
        }

        public override string ToString() {
            return value ?? string.Empty;
        }
    }

Beachte, dass Equals und der != Operator intern auf == zugreifen, um mögliche inkosistenzen zu vermeiden.

Viele Grüße,
Uwe

R
Regenwurm Themenstarter:in
295 Beiträge seit 2008
vor 13 Jahren

perfekt, merci 😃

ServiceStack & Angular = =)

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Regenwurm,

bitte beachte [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

Wenn du das getan hättest, hättest du die Lösung selbst gefunden:

Zitat von: Compilerfehler CS0019
Ein binärer Operator wird auf Datentypen angewendet, die diesen nicht unterstützen.Es ist beispielsweise nicht möglich, den ||-Operator für Zeichenfolgen zu verwenden, die Operatoren +, -, < oder > für bool-Variablen zu verwenden oder den ==-Operator mit einem struct-Typ zu verwenden, es sei denn, der Operator wird damit explizit überladen.

Die Fehlermeldung ist also weder komisch, noch Lösung schwer zu finden.

herbivore