I have the following code:
public enum ClassType
{
    I,
    II,
}
public enum LocationType
{
    A,
    B
}
public class Person
{
    public LocationType LocType
    { get; set; }
    public ClassType ClaType
    { get; set; }
    public override bool Equals(object obj)
    {
        Person obPer = obj as Person;
        if (obPer == null)
            return false;
        if (LocType != obPer.LocType)
            return false;
        if (ClaType != obPer.ClaType)
            return false;
        return true;
    }
    public override int GetHashCode()
    {
        return LocType.GetHashCode()^ClaType.GetHashCode();
    }
}
  static void Main(string[] args)
    {
        var p1 = new Person()
        {
            ClaType = ClassType.I,
            LocType = LocationType.A
        };
        var p2 = new Person()
        {
            ClaType = ClassType.I,
            LocType = LocationType.A
        };
        bool isEqual1 = p1.Equals(p2);  //true
        bool getHashCodeNum = p1.GetHashCode() == p2.GetHashCode();  //true
        bool isEqual2 = p1 == p2;  //false
    }
I find that isEqual1=true, getHashCodeNum=true, but isEqual2=false.
I would expect that since I already override Equals and GetHashCode, then the operator == should automatically follow the behavior of Equals, but this is not so. Any reason?