짧은 답변:
평등은 복잡합니다.
자세한 답변 :
기본 요소 유형은 기본을 대체하고 object.Equals(object)상자 object가 동일한 유형 및 값인 경우 true를 리턴합니다 . (널링 가능 유형에서도 작동합니다. 널이 아닌 널 입력 가능 유형은 항상 기본 유형의 인스턴스에 적용됩니다.)
newAgeis 이므로 동일한 값으로 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이 메소드는 단순히 ints를 직접 비교하기 때문에을 리턴 합니다.
short또한 short.Equals(short)메소드가 있지만 int암시 적으로로 변환 short할 수 없으므로 호출하지 않습니다.
캐스트 로이 메소드를 강제로 호출 할 수 있습니다.
Console.WriteLine(newAge.Equals((short)age)); // true
이것은 short.Equals(short)권투없이 직접 호출 합니다. 경우 age32767보다 큰, 그것은 오버 플로우 예외가 발생합니다.
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를 참조하십시오 .