CS0252: 의도하지 않은 참조 비교가 있을 수 있습니다. 오류는 보통 서로 다른 참조 타입을 비교할 때에 표시해 드리는 경우가 많습니다.
매개변수의 값을 비교하는 IsEquals 메서드가 있다고 가정해 봅시다. 해당 메서드는 비교하려는 값 2개를 매개변수로 하여 값이 같은지 다른지 여부를 판단합니다. 첫 번째 매개변수는 숫자든 문자든 어떠한 객체든 편하게 비교하려고 object 타입을 매개로 하고, 두 번째 매개변수는 사용자가 입력한 string으로 하여 값을 비교합니다.
bool IsEquals(object obj, string str)
{
return obj == str;
}
이때에 컴파일러는 "CS0252: 의도하지 않은 참조 비교가 있을 수 있습니다. 값 비교를 가져오려면 왼쪽을 string 형식으로 캐스팅하세요." 수정사항을 표시합니다. 왜냐하면, 값이 같아서 true일 줄 알았는데 false를 반환하는 경우가 있기 때문입니다.
예를 들면 숫자로 이루어진 약품코드를 비교하는 프로그램이 있다고 했을 때, 약품코드가 object 형식으로 있다면 사용자가 string으로 값을 입력하였을 때 비교 메서드는 거짓을 반환한답니다.
//false
bool b = IsEquals(8806416020302, "8806416020302");
//true
bool b = IsEquals("8806416020302", "8806416020302");
CS0252: 의도하지 않은 참조 비교가 있을 수 있습니다. 사항을 해결하려면 ToString() 또는 (string)으로 캐스팅해 주세요. 아니면 비교 대상을 처음부터 string으로 설정하는 것입니다.
참고하실 겸 "== 연산자"와 "Equals 메서드"의 간단한 차이를 안내해 드립니다.
Equality operator ==
값 타입을 비교하는 경우에는 두 값의 콘텐츠를 비교합니다. 참조 타입을 비교하는 경우에는 두 가지 값이 같은 스토리지에 있는지 여부를 비교합니다. string 타입은 비교 대상의 리터럴이 같다면, 스토리지도 같다고 봅니다.
Equals Method
Equals 메서드는 오브젝트 클래스의 메서드이며, 두 오브젝트가 동일한지 여부를 비교합니다. 다음은 equals 메서드에 대한 안내입니다.
Equals(Object obj)
//
// 요약:
// 지정한 개체와 현재 개체가 같은지 여부를 확인합니다.
//
// 매개 변수:
// obj:
// 현재 개체와 비교할 개체입니다.
//
// 반환 값:
// 지정한 개체가 현재 개체와 같으면 true이고, 다르면 false입니다.
public virtual bool Equals(Object obj);
- 현재 개체가 참조 타입이면 참조 비교를 시도합니다. 이때 참조 비교는 같은 객체를 참조하는지 여부(reference equality)입니다. 이때 Equals 메서드는 ReferenceEquals 메서드 결과와 동일합니다.
- 현재 개체가 값 타입이면 값 비교를 시도합니다. 런타임 타입이 다른 경우에는 거짓을 반환합니다.
byte b = 1; int i = 1; 일 때 두 대상을 비교하면 false입니다.
구조체와 같은 값 타입에 동일한 값을 가지고 있다면, 값을 비교할 때 해당 두 개체는 true입니다.
Equals(Object objA, Object objB)
//
// 요약:
// 지정한 개체 인스턴스가 동일한지를 확인합니다.
//
// 매개 변수:
// objA:
// 비교할 첫 번째 개체입니다.
//
// objB:
// 비교할 두 번째 개체입니다.
//
// 반환 값:
// 개체가 동일한 것으로 간주되면 true이고, 간주되지 않으면 false입니다. objA 및 objB가 null인 경우 메서드는 true를
// 반환합니다.
public static bool Equals(Object objA, Object objB);
- Equals(object, object)는 두 객체가 같은 객체참조인지 판단합니다. 두 객체가 같거나, 모두 null인 경우 true입니다.
- 두 객체 중 하나만 null인 경우 false입니다.
- 동일한 객체 참조도 아니고, null 여부도 문제가 없다면 objA.Equals(objB) 메서드의 결과를 반환합니다.
String.Equals Method
//
// 요약:
// 이 인스턴스와 지정한 다른 System.String 개체의 값이 같은지를 확인합니다.
//
// 매개 변수:
// value:
// 이 인스턴스와 비교할 문자열입니다.
//
// 반환 값:
// true 매개 변수와 이 인스턴스의 값이 같으면 value이고, 그러지 않으면 false입니다. value가 null이면 메서드에서 false을
// 반환합니다.
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public bool Equals(String value);
//
// 요약:
// 이 인스턴스와 지정한 개체의 값이 같은지를 확인합니다. 이 개체도 System.String 개체여야 합니다.
//
// 매개 변수:
// obj:
// 이 인스턴스와 비교할 문자열입니다.
//
// 반환 값:
// true가 obj이고 이 인스턴스와 같은 값을 가지면 System.String이고, 그러지 않으면 false입니다. obj가 null이면
// 메서드에서 false을 반환합니다.
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public override bool Equals(object obj);
클래스에서 사용하는 Equals 메서드는 대개 오브젝트의 Equals를 오버라이드 하거나 새로 정의한 메서드입니다. 스트링의 경우 참조 타입이기는 하나, 비교 메서드에서 값이 같은지 여부를 판단하는 경우가 많습니다.