2012-08-09 2 views
3

object.ReferenceEquals이 true를 반환하면 instance.Equals이 항상 true를 반환해야합니까?ReferenceEquals는 true이고 같음 - false는 예상되는 동작입니까?

아래 출력이 합격/불합격하는 예상치 못한 동작이 있다고 생각하십니까?

Assert.True(object.ReferenceEquals(obj,obj)); 
Assert.True(obj.Equals(obj)); 

개인적으로 나는 그것의 이상한 및 캔트 정말 인스턴스 자체와 동일해서는 안 좋은 이유, 생각 생각합니다.

+0

정확히 무엇을 묻고 있습니까? 그 반대가 항상 사실 인 것은 아닙니다. –

+0

불분명 한 부분은 무엇입니까? 나는 그 반대가 항상 사실이 아니라는 것을 압니다. 그러나 도태는 항상 사실이어야합니다. – jasper

답변

7

질문에 대한 답변에는 두 가지 방법이 있습니다.

  • 예기치 않은 동작입니다. 예. .ReferenceEquals에서 true를 반환하면 올바르게 디자인 된 클래스는 항상 .Equals에서 true를 반환해야합니다. 다음과 같이

    는 Object.Equals 방법에 정의 된 계약에 따라 :
              x.Equals(x) true를 반환 즉 클래스 라이브러리, Implementing the Equals Method 기사 개발을위한 MSDN의 디자인 가이드 라인 성문화입니다.

  • 그러나이 요구 사항은 언어 또는 런타임에 의해 강제 적용되지 않습니다. 문제의 클래스 디자이너는 Equals{ return false; }으로 정의 할 수 있습니다. Perverse,하지만 가능합니다.

+0

다른 답변 (제거 된 이유)이 왜이 답변과 마찬가지로 대답했는지 모르겠습니다. 어색하지만 가능합니다. 더 잘 이해하려면 객체의 클래스를 알아야합니다. 어쨌든 +1 –

+0

소유자가 @Andre를 삭제했습니다. –

+0

실제로, 그러나 누군가는 그것을 떨어 뜨렸고 나는 동의하지 않습니다. 어쨌든, 당신의 대답은 더 완전합니다. –

2

예, 참조 equals가 true 인 경우 equals를 올바르게 구현하면 true를 반환해야합니다.

+0

엄밀히 말하면, 아니오. Equals가 바보 같은 일을하도록 무시되면. 불평등을 강제하면 .Equals는 동일한 인스턴스 인 경우에도 true를 반환하지 않을 수 있습니다. –

+1

@StefanH - 나는 equals 구현을 *해야한다고 말했지만, 사실로 돌아 가지 않을 것입니다. – manojlds

관련 문제