Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# generics class operators not working

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?

like image 949
user3205810 Avatar asked Jan 17 '14 09:01

user3205810


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

Is C language easy?

C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr. Stroustroupe.

Is C programming hard?

C is more difficult to learn than JavaScript, but it's a valuable skill to have because most programming languages are actually implemented in C. This is because C is a “machine-level” language. So learning it will teach you how a computer works and will actually make learning new languages in the future easier.


1 Answers

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...

like image 112
Thomas Levesque Avatar answered Oct 30 '22 16:10

Thomas Levesque