Ihre generische Methode wird im Grunde eine Referenz Gleichheitsprüfung durchführen - und die Werte von s1
und s2
beziehen sich auf unterschiedliche, aber gleich Saiten. Sie können wie folgt dies leichter zeigen:
string x = "test";
string y = new string(x.ToCharArray());
Console.WriteLine(x == y); // Use string overload, checks for equality, result = true
Console.WriteLine(x.Equals(y)); // Use overridden Equals method, result = true
Console.WriteLine(ReferenceEquals(x, y)); // False because they're different objects
Console.WriteLine((object) x == (object) y); // Reference comparison again - result = false
Beachten Sie, dass Ihre Einschränkung in OpTest
ändert nicht die ==
Operator verwendet wird. Dies wird zur Kompilierungszeit bestimmt, basierend auf den Einschränkungen auf T
. Beachten Sie, dass Operatoren niemals überschrieben werden, nur überladen. Das bedeutet, dass die Implementierung zur Kompilierungszeit unabhängig vom Typ zur Ausführungszeit ausgewählt wird.
Wenn Sie T
von einem Typ ableiten, der den Operator ==
überlastet, wird der Compiler diese Überladung verwenden. Zum Beispiel:
using System;
class SillyClass
{
public static string operator ==(SillyClass x, SillyClass y) => "equal";
public static string operator !=(SillyClass x, SillyClass y) => "not equal";
}
class SillySubclass : SillyClass
{
public static string operator ==(SillySubclass x, SillySubclass y) => "sillier";
public static string operator !=(SillySubclass x, SillySubclass y) => "very silly";
}
class Test
{
static void Main()
{
var x = new SillySubclass();
var y = new SillySubclass();
OpTest(x, y);
}
static void OpTest<T>(T x, T y) where T : SillyClass
{
Console.WriteLine(x == y);
Console.WriteLine(x != y);
}
}
Hier ist die OpTest
Methode die überladenen Operatoren nicht verwendet - aber immer nur die, die von SillyClass
, nicht SillySubclass
.
Es hilft, die IL z.B. Verwenden Sie Ildasm, um diese Art von Verhalten selbst zu erforschen. – Jeroen
Wenn Sie für die Gleichheit in generischem Code vergleichen möchten, verwenden Sie 'EqualityComparer .Default.Equals (s, t)' und ermöglichen Sie dem Benutzer optional, seinen eigenen 'IEqualityComparer ' zu übergeben. –
CodesInChaos
Mögliches Duplikat von [C# -Differenz zwischen == und Equals()] (https://stackoverflow.com/questions/814878/c-sharp-difference-between-and-equals) – Dukeling