짧은 답변:
평등은 복잡합니다.
자세한 답변 :
기본 요소 유형은 기본을 대체하고 object.Equals(object)
상자 object
가 동일한 유형 및 값인 경우 true를 리턴합니다 . (널링 가능 유형에서도 작동합니다. 널이 아닌 널 입력 가능 유형은 항상 기본 유형의 인스턴스에 적용됩니다.)
newAge
is 이므로 동일한 값으로 boxed short 를 전달하면 short
해당 Equals(object)
메소드 만 true를 리턴합니다 . boxed를 전달 하므로 false를 반환합니다.int
대조적으로, ==
연산자는 2 int
초 (또는 1 short
초) 를 취하는 것으로 정의됩니다 long
.
당신이 그것을 호출 할 때 int
와 short
, 컴파일러는 암시 적으로 변환됩니다 short
에 int
그 결과 비교 int
값으로들.
그것을 작동시키는 다른 방법들
기본 유형 Equals()
에는 동일한 유형을 허용하는 자체 메소드 도 있습니다 .
작성 age.Equals(newAge)
하면 컴파일러 int.Equals(int)
에서 최상의 과부하를 선택 하고 암시 적으로로 변환 short
합니다 int
. true
이 메소드는 단순히 int
s를 직접 비교하기 때문에을 리턴 합니다.
short
또한 short.Equals(short)
메소드가 있지만 int
암시 적으로로 변환 short
할 수 없으므로 호출하지 않습니다.
캐스트 로이 메소드를 강제로 호출 할 수 있습니다.
Console.WriteLine(newAge.Equals((short)age)); // true
이것은 short.Equals(short)
권투없이 직접 호출 합니다. 경우 age
32767보다 큰, 그것은 오버 플로우 예외가 발생합니다.
short.Equals(object)
오버로드를 호출 할 수도 있지만 박스형 객체를 명시 적으로 전달하여 동일한 유형을 얻습니다.
Console.WriteLine(newAge.Equals((object)(short)age)); // true
이전 대안과 마찬가지로,에 맞지 않으면 오버플로가 발생합니다 short
. 이전 솔루션과 달리 short
시간과 메모리를 낭비하여 객체를 상자에 넣습니다.
소스 코드:
Equals()
실제 소스 코드의 두 가지 방법은 다음과 같습니다 .
public override bool Equals(Object obj) {
if (!(obj is Int16)) {
return false;
}
return m_value == ((Int16)obj).m_value;
}
public bool Equals(Int16 obj)
{
return m_value == obj;
}
추가 자료 :
Eric Lippert를 참조하십시오 .