[C#] 의도하지 않은 참조 비교가 있을 수 있습니다. 값 비교를 가져오려면 왼쪽을 string 형식으로 캐스팅하세요. CS0252 해결 방법

CS0252: 의도하지 않은 참조 비교가 있을 수 있습니다. 오류는 보통 서로 다른 참조 타입을 비교할 때에 표시해 드리는 경우가 많습니다. 

CS0252 의도하지 않은 참조 비교가 있을 수 있습니다.

매개변수의 값을 비교하는 IsEquals 메서드가 있다고 가정해 봅시다. 해당 메서드는 비교하려는 값 2개를 매개변수로 하여 값이 같은지 다른지 여부를 판단합니다. 첫 번째 매개변수는 숫자든 문자든 어떠한 객체든 편하게 비교하려고 object 타입을 매개로 하고, 두 번째 매개변수는 사용자가 입력한 string으로 하여 값을 비교합니다.

bool IsEquals(object obj, string str)
{
    return obj == str;
}

이때에 컴파일러는 "CS0252: 의도하지 않은 참조 비교가 있을 수 있습니다. 값 비교를 가져오려면 왼쪽을 string 형식으로 캐스팅하세요." 수정사항을 표시합니다. 왜냐하면, 값이 같아서 true일 줄 알았는데 false를 반환하는 경우가 있기 때문입니다.

값 비교를 가져오려면 왼쪽을 string 형식으로 캐스팅하세요.

예를 들면 숫자로 이루어진 약품코드를 비교하는 프로그램이 있다고 했을 때, 약품코드가 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를 오버라이드 하거나 새로 정의한 메서드입니다. 스트링의 경우 참조 타입이기는 하나, 비교 메서드에서 값이 같은지 여부를 판단하는 경우가 많습니다.

댓글