Wie Sie feststellen, wenn zwei generische Typ-Werte gleich sind?

Update*
Ich bin so traurig... mein Beispiel-code enthielt einen Fehler, in dessen Folge viele Antworten habe ich nicht verstanden.
Statt

Console.WriteLine("3. this.Equals   " + (go1.Equals(go2)));

Ich soll schreiben

Console.WriteLine("3. this.Equals   " + (go1.Equals(sb2)));

Ich versuche, herauszufinden, wie kann ich erfolgreich bestimmen, wenn zwei generische Typ-Werte sind einander gleich. Basierend auf Mark Byers' Antwort auf diese Frage ich würde denken, kann ich einfach value.Equals() Wert ist, wobei ein generischer Typ.
Mein eigentliche problem ist in einer LinkedList-Implementierung, aber das problem kann angezeigt werden mit diesem einfacheren Beispiel.

class GenericOjbect<T> {
    public T Value { get; private set; }
    public GenericOjbect(T value) {
        Value = value;
    }
    public bool Equals(T value) {
        return (Value.Equals(value));
    }
}

Nun definiere ich eine Instanz von GenericObject<StringBuilder> mit new StringBuilder("StackOverflow"). Ich würde erwarten, dass man true wenn ich den Anruf Equals(new StringBuilder("StackOverflow") auf dieser GenericObject Instanz, aber ich bekomme false.

Einem Beispiel-Programm zeigt dies:

using System;
using System.Text;

class Program
{
    static void Main()
    {
        var sb1 = new StringBuilder("StackOverflow");
        var sb2 = new StringBuilder("StackOverflow");

        Console.WriteLine("StringBuilder compare");
        Console.WriteLine("1. ==            " + (sb1 == sb2));
        Console.WriteLine("2. Object.Equals " + (Object.Equals(sb1, sb2)));
        Console.WriteLine("3. this.Equals   " + (sb1.Equals(sb2)));

        var go1 = new GenericOjbect<StringBuilder>(sb1);
        var go2 = new GenericOjbect<StringBuilder>(sb2);

        Console.WriteLine("\nGenericObject compare");
        Console.WriteLine("1. ==            " + (go1 == go2));
        Console.WriteLine("2. Object.Equals " + (Object.Equals(go1, sb2)));
        Console.WriteLine("3. this.Equals   " + (go1.Equals(sb2)));
        Console.WriteLine("4. Value.Equals  " + (go1.Value.Equals(sb2.Value)));
    }
}

Für die drei Methoden zum Vergleich von zwei StringBuilder-Objekte, nur die StringBuilder.Gleich-Instanz-Methode (Dritte Zeile) gibt true. Dies ist, was ich erwartet hatte. Aber wenn man die GenericObject Objekte, deren Equals () - Methode (die Dritte Zeile) gibt false. Interessanterweise ist der vierte Methode vergleichen hat zurück true. Ich denke, die Dritte und vierte Vergleich sind eigentlich die gleiche Sache zu tun.

Hätte ich erwartet true. Denn in der Equals () - Methode der Klasse GenericObject, beide value und Value Typ T in diesem Fall ist eine StringBuilder. Basierend auf Mark Byers' Antwort in diese Frage, ich hätte gedacht, dass die Value.Equals() Methode zu verwenden, die das StringBuilder-Objekt die Equals () - Methode. Und wie ich gezeigt habe, das StringBuilder-Objekt Gleich ist () - Methode zurück true.

Habe ich sogar versucht

public bool Equals(T value) {
    return EqualityComparer<T>.Default.Equals(Value, value);
}

aber, dass auch false zurück.

So, zwei Fragen hier:

  1. Warum nicht den code zurück true?
  2. Wie könnte ich implementieren, die Equals Methode, so dass es hat zurück true?
InformationsquelleAutor comecme | 2011-01-09
Schreibe einen Kommentar