Question: Consider this code:

```
int age = 25;
short newAge = 25;
Console.WriteLine(age == newAge);  //true
Console.WriteLine(newAge.Equals(age)); //false
Console.ReadLine();

```

Both `int` and `short` are primitive types, but a comparison with `==` returns true and a comparison with `Equals` returns false.

Why?

Answer: 
Because there is no overload for `short.Equals` that accepts an `int`. Therefore, this is called:

```
public override bool Equals(object obj)
{
    return obj is short && this == (short)obj;
}

```

`obj` is not a `short`.. therefore, it is false.
**Equals()** is a method of **System.Object** Class  

Syntax : **Public virtual bool Equals()**  

Recommendation if we want to compare state of two objects then we should use **Equals()** method 

as stated above answers **==** operators compare the values are same. 

**Please don't get confused with ReferenceEqual** 

**Reference Equals()**  

Syntax : public static bool ReferenceEquals()  

It determine whether the specified objects instance are of the same instance