C# generics class operators not working

c#, generics, operators

Solution

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 be `Test` (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 be `Test` or a subclass of `Test`, it will work as expected, but of course it won't work anymore for other types...

Problem

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?

Original source