2010-03-01 2 views
3

절대적으로 데이터 유형을 하드 코딩 할 수 없습니다. 엄격한 데이터 입력이 필요합니다. TValue a < = TValue를 사용해야합니다. b. 다시 말하지만, (이중) a와 같은 것을 할 수있는 방법은 절대적으로 없습니다. 이것은 필수적인 라이브러리 구현의 일부입니다. 일반 값과 ​​관련하여 유일한 것은 정적 유형이라는 것입니다. IComparable 및 다른 인터페이스가 작동하지 않는 것 같습니다.덜 작거나 큰 조작을 구현해야합니다.

+5

그리고 질문은 ...? – Krab

+8

당신은 질문을 알지 못함에도 불구하고 +1을주었습니다. :-) –

답변

31

IComparable이 왜 효과가 없습니까?

"<"및 ">"기호를 사용하는 구문 설탕을 얻을 수 없지만 CompareTo의 결과가 0보다 작거나 같은지 확인하여 동일한 정보를 제공하는지 확인할 수 있습니다.

함께 작업하기에 좋은 확장 메서드를 작성할 수도 있습니다.

static void Main(string[] args) 
{ 
    Console.WriteLine(1.IsGreaterThan(2)); 
    Console.WriteLine(1.IsLessThan(2)); 
} 

public static bool IsGreaterThan<T>(this T value, T other) where T : IComparable 
{ 
    return value.CompareTo(other) > 0; 
} 

public static bool IsLessThan<T>(this T value, T other) where T : IComparable 
{ 
    return value.CompareTo(other) < 0; 
} 
+2

또는 'IComparable '로 제한하십시오. – TrueWill

3

데이터 유형 및 유스 케이스를 좀더 정확하게 사용할 수 있습니까?

결국 비교 작업을 구현하려면 클래스에 대한 정보가 필요합니다. 완전한 제네릭 구현은 일반적으로 GetHashCode() 또는 ToString()에서 정렬하지 않는 한 일반적으로 두 객체를 비교하는 데 필요한 정보를 얻지 못했습니다. 이는 매우 이상한 일입니다. 외부 비교 구현 등의 객체에

당신이 당신의 유형에 IComparable 또는 IComparable<T>을 구현 한 경우에, 당신은 자동으로 후자의 변형을 얻을 수 Comparer<T>.Default을 사용할 수 있습니다 - 짧은 조금 쓰기 비교 소비자를 만드는하고을 필요로하는 일반적인 제약 조건에 대한 대안 IComparable<T>으로 입력하십시오.

+0

+1'Comparer .Default'가 무엇을 설명하는지, 언제 유용할까요? – ToolmakerSteve

15

그냥 System.Collections.Generic.Comparer<T>.Default.Compare(x,y)을 사용하고 음수, 양수 및 0 개의 반환 값을 찾으십시오.

이 코드는 IComparable<T>IComparable을 모두 지원하며 클래스, 구조체 및 Nullable<T> -of-structs에 사용할 수 있습니다.

+5

-ve 및 + ve는 무엇입니까? – Gabe

+0

그 트릭을 할 것으로 보인다. Visual Studio Express 2010 Beta를 사용하고 있으며 Intellisense는이 상황을 인식하지 못했습니다. 매우 이상한 행동. –

+3

@ gabe : "긍정"과 "부정"을 작성하는 속기 방법입니다. –

관련 문제