문제 상황
== 연산자를 오버로딩하고 사용하려 했는데, 문제가 발생했다.
a == b 와 같은 구문에서 a나 b가 null인 경우를 판단할 수 없었기 때문이었다.
public static bool operator ==(Stat a, Stat b)
{
if (a == null && b == null) return true;
}
이와 같이 작성하게 되면, 스택 오버플로우가 발생한다.
이유는 당연하다. a == null인 구문도 연산자 오버로딩한 '==' 연산자를 사용하기 때문.
해결법
object.ReferenceEquals(object, object)을 사용하면 된다.
Equals나 ==과는 달리, object.ReferenceEquals는 재정의할 수 없는 메서드이다.
이 메서드는 지정한 object의 인스턴스가 동일한지 체크한다.
따라서 오버로딩한 Equals/==를 사용하지 않고 두 개체를 비교할 수 있는 것.
public static bool operator ==(Stat a, Stat b)
{
if (object.ReferenceEquals(a, null))
return object.ReferenceEquals(b, null);
else if (object.ReferenceEquals(b, null))
return false;
//이후 원하는 return 코드 작성
}
==를 오버로딩할 때 위와 같이 코드를 작성하면 null 체크 이후 원하는 return값을 던질 수 있을 것이다.