2016-04-06 6 views
9

Der folgende Code ist gegeben, ich möchte nur zwei Objekte in einer generischen Klasse vergleichen.Vergleich der typisierten Objekte in der generischen Klasse

public bool Compare<T>() 
    { 
     T var1 = default(T); 
     T var2 = default(T);   
     return var1 == var2; 
     //Error CS0019 Operator '==' cannot be applied to operands of type 'T' and 'T' 
    } 

Kann jemand erklären, warum es nicht möglich ist, diese beiden Objekte in dieser generischen Klasse zu vergleichen?

+0

Ist die 'default (T)' nur so ein Beispiel, oder ist das eigentlich der Fall, den Sie vergleichen möchten? Sonst würde ich sagen, dass es immer nur "wahr" ist, solange der Implementierer einer Struktur nicht völlig unkonventionell ist mit dem Überschreiben von '=='. – MicroVirus

Antwort

-1

Sie können den == -Operator nicht für Ihren Typ T verwenden, da nicht garantiert werden kann, dass dieser Operator für diesen Typ definiert ist. Stellen Sie sich vor, T ist vom Typ KeyValuePair zum Beispiel. Sie können die folgenden nicht schreiben:

var areEqual = (new KeyValuePair<string, string>("1", "1") == new KeyValuePair<string, string>("2", "2")) 

einige Beschränkung auf generische Art Stellen wie where T : new() nur Klassen zu ermöglichen, in denen der Standardwert null ist.

EDIT: Als eine Einschränkung nur Klassen ziemlich sinnlos ist, weil Referenz-Typen Allways auf null Standard können Sie Ihre Instanz von T-object unbox und rufen dann die == -Operator:

public bool Compare<T>() 
{ 
    object var1 = default(T); 
    object var2 = default(T); 
    if (var1 == null) return var1 == var2; 
    return var1.Equals(var2); 
} 

Dies ermöglicht Ihnen, um die Methode sowohl für Wert- als auch für Referenztypen aufzurufen.

+0

Was ist, wenn var1 null ist? Es wird nicht funktionieren –

+0

@MartinSwanepoel Guter Punkt, aktualisiert. – HimBromBeere

+0

Noch wird nicht funktionieren 'return var1 == var2;' –

1

Der Typ T ist nicht unbedingt ein Referenztyp, T ein Typargument ist und kann eine Klasse oder eine Struktur sein, so dass der Compiler wird nicht von dieser Annahme ausgehen kann, zu.

Sie können wie

tun auch
public bool Compare<T>() 
{   
     T var1 = default(T); 
     T var2 = default(T); 

     return !EqualityComparer<T>.Default.Equals(var1, var2); 
} 

Sie können versuchen, Sie können zu machen T IComparable<T> oder aber versuchen, eine IComparer<T> Ihrer Klasse zu verwenden.

+0

Dies wird 'Object.Equals' (und' Object.GetHashCode') für 'T' verwenden, außer' T: IEquatable ', in diesem Fall verwendet es das. – MicroVirus

-1

Sie sollten T auf die IEquatable<T> Schnittstelle beschränken, dann können Sie sie vergleichen, indem Sie die Equals Methode aufrufen.

public bool Compare<T>(T var1, T var2) where T : IEquatable<T> 
{ 
    return var1.Equals(var2); 
} 
0

Schnell Option:

public bool Compare<T>() 
{ 
    var t1 = default(T); 
    var t2 = default(T); 
    return object.Equals(t1, t2); 
} 

generisch richtige Option:

public bool Compare<T>() 
{ 
    var t1 = default(T); 
    var t2 = default(T); 
    return EqualityComparer<T>.Default.Equals(t1, t2); 
} 

Schreiben des Codes unten vorsichtig, denn wenn die Variable t1 null ist, dass Sie eine Ausnahme erhalten

public bool Compare<T>() 
{ 
    var t1 = default(T); 
    var t2 = default(T); 
    return t1.Equals(t2); 
} 
Verwandte Themen