2013-06-10 2 views
11

주어진 개체가 null 일 때 CompareTo 메서드에서 반환 할 내용은 무엇입니까?Override CompareTo : null의 경우 어떻게해야할까요?

MSDN Library1이 반환되는 예제를 보여줍니다. 그러나 null과 비교할 수 없으므로 오류가 발생할 것으로 예상됩니다.

나는이 답변과는 다른 의견을 기대합니다. 가장 좋은 방법은 무엇입니까?

+1

null과 비교하면 "불가능"하다는 것을 의미합니까? 모든 참조 유형은 null과 정상적으로 비교 될 수 있습니다. 그렇지 않으면 [Nullable 클래스] (http://msdn.microsoft.com/en-us/library/system.nullable.aspx)로 랩핑 할 수 있습니다. – Renan

+0

"다른 의견을 원한다면"이것은 스택 오버플로에 적합하지 않으므로 FAQ에서 "주관적인 질문을 피하지 않으면 안됩니다"라는 명확한 통계가 나와 있습니다. –

+1

예제가 유효합니다. CompareTo가 객체의 정렬 순서를 반환하기 때문에 null을 첫 번째 요소 – NoviceProgrammer

답변

22

예, 좋습니다. 다른 대답이 말하는 것과는 달리, 가장 인기있는 행동이 아니라 예상되는 표준이 있습니다.

정답은 IComparable<T>.CompareToIComparable.CompareTo 대한 MSDN 문서에 주어진다 정의에

은 개체보다 큰 및 참조 서로 동일 비교 두 널을 비교한다.

(계약 상이 큰 비교는 다음과 같이 정의된다. a > b 다음 a.CompareTo(b) > 0 경우)

이 예상되는 동작은 예를 들면 Nullable.Compare<T> 확증된다. Null은 항상 값보다 작은 것으로 비교됩니다.

매개 변수, OBJ는, 클래스 또는 값 형식 와 동일한 유형이어야합니다

또한 제네릭이 아닌 비교를 위해, 일치하지 유형이 null로 취급되어서는 안된다는 지적 가치 이 인터페이스를 구현하는; 그렇지 않으면 ArgumentException이 입니다.


이 귀하의 질문에 영향을 미칠하지만 인식하지 않는

, Nullable<T> comparison operators (==, !=, <, <=, >, >=)는 IComparable 규칙을 따르지 않습니다. Null 허용 유형 중 하나 의 값이 널 (null)이고 다른 하나는없는 경우

당신은 nullable 형식으로 != (같지 않음)을 제외하고 false로 평가 모든 비교를 비교를 수행합니다. 은 특정 비교가 false을 반환하므로 대소 문자는 true을 반환한다고 가정하십시오. 다음 예에서 10은 이 아니며,보다 작거나 같지 않으며 null이 아닙니다. num1 != num2true으로 평가됩니다.

(int?)null == (int?)null이 사실로 평가되는 이상한 결과가 있지만 (int?)null <= (int?)null은 그렇지 않습니다.

2

선택 사항은 귀하의 것입니다. 내가 무언가를 비교할만한 유스 케이스를 상상할 수있는 가능성을 넘어서서, "무언가"를 더 크게 보길 원합니다. 하지만 그게 당신이 그것을 무시하는 이유입니다, 그래서 당신은 당신이 그 사건을 어떻게 처리 할지를 결정할 수 있습니다.

1

가장 좋은 방법은 특정 사례에 따라 달라집니다. 비교 대상에 따라 null을 비교하는 것이 가능할 수 있습니다.

null이 어떤 비교에서도 가능한 가장 낮은 값인 개체를 정의하면 null과 비교하면 분명히 정의가 가능하며 잘 정의 된 결과를 얻습니다. 다른 경우에는 예외를 throw하는 것이 더 합리적 일 수 있습니다.

궁극적으로 이것은 반드시 (단지 주관적 인) 디자인 질문이며, 반드시 하나의 대답은 아닙니다.

-1

null 인수가있는 CompareTo는 항목이 null 인 목록을 정렬하는 경우에 영향을줍니다. 지정된 객체가 null 인 경우에 1을 돌려 주면 (자), 소트시에리스트의 맨 위에 null가 표시되어 가장 인기가있는 동작입니다.