Frage

In Visual Studio (Pro 2008), habe ich bemerkt, nur einige inkonsistentes Verhalten und fragte sich, ob es eine logische Argumentation dahinter war

In einem WinForms-Projekt, wenn ich die Zeile mit

if(myComboBox.Items[i] == myObject)

Ich erhalte eine Compiler-Warnung, die ich könnte ‚mögliche unbeabsichtigte Referenzen‘ bekommen, wie ich Objekt bin im Vergleich Typ MyObject eingeben. Fair enough.

Wenn ich aber stattdessen eine Schnittstelle verwenden, um zu vergleichen, gegen:

if(myComboBox.Items[i] == iMyInterface)

die Kompilierung Warnung geht weg.

Kann jemand denken, ob es ein logischer Grund ist, warum dies geschehen soll, oder einfach nur ein Artefakt des Compiler nicht Schnittstellen zum Vergleich Warnungen zu überprüfen. Irgendwelche Gedanken?

Bearbeiten In meinem Beispiel wurde die Combobox an eine Liste gebunden, aber diese Liste wurde mit list<IMyInterface>.Cast<MyObject>().ToList<MyObject>() erzeugt

Es ist, als wenn die Compiler nur noch unter der Annahme ich auf die Liste des IMyInterface bin verbindlich.

(Object und Interface-Methoden geändert wurden die Unschuldigen zu schützen)

War es hilfreich?

Lösung

Die Kompilierung für die erste Probe Warnung ist, da jede benutzerdefinierte Operator == für Ihre Klasse ignoriert werden würde, und die Referenzen verglichen (vielleicht nicht, was Sie wollten, damit die Warnung).

Es ist nicht möglich, festzulegen, dass ein Bediener an einer Schnittstelle außer Kraft gesetzt werden sollte, so wird dies immer ein Referenzvergleich sein. Die Warnung ist nicht erforderlich, weil Sie dies immer erwarten sollten.

Hier ist ein Beispiel für das Überschreiben des Operators ==:

class Program
{
    static void Main(string[] args)
    {
        object t1 = new MyTest() { Key = 1 };
        MyTest t2 = new MyTest() { Key = 1 };

        Console.WriteLine((MyTest)t1 == t2); // Uses overriden == operator, returns true
        Console.WriteLine(t1 == t2); // Reference comparison, returns false
    }
}

public class MyTest
{
    public int Key { get; set; }

    public override bool Equals(object obj)
    {
        return this.Key == (obj as MyTest).Key;
    }

    public override int GetHashCode()
    {
        return this.Key.GetHashCode();
    }

    public static bool operator ==(MyTest t1, MyTest t2)
    {
        return t1.Equals(t2);
    }

    public static bool operator !=(MyTest t1, MyTest t2)
    {
        return !t1.Equals(t2);
    }

}

Die MyTest Klasse wird als gleich betrachtet, wenn die Key-Eigenschaft ist gleich. Wenn Sie eine Schnittstelle schaffen sind, können Sie nicht angeben, dass es einen benutzerdefinierten Operator == und damit der Vergleich immer einen Referenz Vergleich wäre umfassen sollte (und daher falsch im Fall unseres Beispielcode).

Andere Tipps

Lagerdalek,

Die Warnung erzeugt wird, weil Sie das Element aus der Items-Auflistung zurück in den ursprünglichen Typ umwandeln müssen, die an das Kombinationsfeld gebunden war, vor dem Vergleich; sonst können Sie unerwartete Ergebnisse erhalten, wie der Compiler warnt.

Hier ist ein Beispiel:

myComboBox.DataSource = Collection<Car>;

Also, wenn das Kombinationsfeld auf eine Sammlung von gebunden ist Auto Objekte Sie sie wieder vor dem Vergleich werfen würden:

if((car)myComboBox.Items[i] == thisCar)

Dann sollten Sie keine Warnungen erhalten.

Eine andere Methode, die Sie tun können, ist:

using(myComboBox.Items[i] as car){
 if(myComboBox.Items[i] == thisCar)
}

Lassen Sie mich wissen. Viel Glück! Ich bin aus dem Gedächtnis gehen, ich hoffe, dass ich nichts falsch eingeben haben. : O)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top