Wie zwei Elemente des gleichen, aber ungezwungenen generischen Typs für Gleichheit vergleichen? [Duplikat]

StackOverflow https://stackoverflow.com/questions/336884

Frage

  

Mögliche Duplizieren:
   Kann nicht Operator == auf generische Typen in C # angewendet werden?

Ich habe die folgende generische Klasse bekam und der Compiler beschwert sich, dass "Operator '!=' cannot be applied to operands of type 'TValue' and 'TValue'" (siehe CS0019 ):

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {
            if (_value != value) // <<-- ERROR
            {
                _value= value;
                OnPropertyChanged("Value");
            }
        }
    }
}

Wenn ich TValue einschränken class, kann ich Object.Equals() verwenden. Da ich dies für boths structs und Klassen benötigen würde ich sehr glücklich sein, wenn ich das allerdings vermeiden kann.

Die Frage ist also, wie kann ich vergleichen zwei Elemente des gleichen, aber ungezwungenen generischen Typs für die Gleichstellung?

War es hilfreich?

Lösung

Haben Sie versucht, so etwas wie das?

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}

Andere Tipps

Drei Optionen:

  • Constrain TValue IEquatable<TValue> zu implementieren und dann rufen x.Equals(y)
  • Nehmen Sie einen anderen Parameter des Typs IEqualityComparer<TValue> und verwenden, die
  • Verwenden Sie EqualityComparer<TValue>.Default die Vergleiche
  • auszuführen

Sie können immer mischen und anpassen Optionen 2 und 3, natürlich - auf den Standardvergleich Standard, sondern erlauben auch ein spezifischer zur Verfügung gestellt werden

.
  • Equals () für Werttypen
  • Reference () für Referenztypen

Ist IComparable eine Option?

public class Example<TValue> where TValue: IComparable
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (_value.CompareTo(value) != 0)
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}

Ich denke, die != Operator kann hier nicht angewendet werden, da es Fälle gibt, in denen es nicht verwendet werden kann. Zum Beispiel != kann nicht für den Vergleich von Strukturen verwendet werden, es sei denn, die Vergleichsoperatoren (== !=) überlastet sind.

Natürlich können Sie die Sprache structs vergleichen, wie int != int, aber ich bin nicht sicher, wie dies umgesetzt wird.

Also, weil TValue kann ein benutzerdefinierte struct, kann es nicht den != Operator verwenden.

public static bool operator ==(EntityBase<T> entity1, EntityBase<T> entity2)
        {
            if ((object)entity1 == null && (object)entity2 == null)
            {
                return true;
            }

            if ((object)entity1 == null || (object)entity2 == null)
            {
                return false;
            }

            if (Comparer<T>.Default.Compare(entity1.Id, entity2.Id) != 0)
            {
                return false;
            }

            return true;
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top