Wie zwei Elemente des gleichen, aber ungezwungenen generischen Typs für Gleichheit vergleichen? [Duplikat]
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?
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 rufenx.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;
}