[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를 오버라이드 하거나 새로 정의한 메서드입니다. 스트링의 경우 참조 타입이기는 하나, 비교 메서드에서 값이 같은지 여부를 판단하는 경우가 많습니다.

댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗