I have a problem with generic. When I try to use less operators in generic, their call is not happening. But it works with the method Equals. That is a some test class:
public class Test
{
public int i;
static public Boolean operator ==(Test obj1, Test obj2)
{
Console.WriteLine("operator ==");
return obj1.i == obj2.i;
}
static public Boolean operator !=(Test obj1, Test obj2)
{
Console.WriteLine("operator !=");
return obj1.i != obj2.i;
}
public override bool Equals(object obj)
{
Console.WriteLine("operator equals");
return this == (Test)obj;
}
public override int GetHashCode()
{
Console.WriteLine("HashCode");
return 5;
}
}
And class Checker:
public class Checker
{
public Boolean TestGeneric<T>(T Left, T Right) where T : class
{
return Left == Right; //not work override operators
return Left.Equals(Right); //work fine
}
}
Small testing:
Test left = new Test() { i = 4 };
Test right = new Test() { i = 4 };
var checker = new Checker();
Console.WriteLine(checker.TestGeneric<Test>(left, right));
Console.ReadKey();
How I can use less operators in class Test from generic?
Overloaded operators are static methods, so they don't participate in polymorphism; they are resolved statically at compile time, based on the known type of the operands.
In a generic method, the compiler can't know that
T
will beTest
(since it could actually be anything else), so it uses the most general definition of==
, which is reference comparison.Note that if you add a constraint on the generic method to force
T
to beTest
or a subclass ofTest
, it will work as expected, but of course it won't work anymore for other types...