2011-03-05 2 views
0

이 틀림 인위적인 일반 정의를 생각해이 "일반 방법"은 어떤 "where"절이 작동하게합니까?

private void Foo<T,BASETYPE>(PropertyInfo prop, BASETYPE o1, BASETYPE o2) 
    { 
     T value1 = (T) prop.GetValue(o1, null); 
     T value2 = (T) prop.GetValue(o2, null); 
     if (value1 != value2) 
      Console.WriteLine("NOT EQUAL"); 
    } 

소품이 baseType 여기서위한 PropertyInfo로 보장됩니다.

가 나는 경우() 문에서 컴파일 오류가 점점 오전 : "일반 케이스"내가 오류 메시지가 유효하다는 것을 이해하지만

Operator '!=' cannot be applied to operands of type 'T' and 'T' 

는,이 경우에, 난 단지에 대한 루틴을 원하는 표준 형식 중 일부 : System.Int64, System.String 등 == 및! = 연산자를 모두 지원합니다.

"where"절로 수정 될 수 있다고 가정하지만 IComparable과 IEqualable은 도움이되지 않습니다.

올바른 "where"절이 누구인지 아시겠습니까?

프랭크

답변

4

등 System.Int64, 선택 System.String .. 때문에 목록에서 당신이

where T : IComparable 

를 사용하여 예를 들어 CompareTo() 대신

!=의를 사용할 수, IComparable를 구현합니다. 이 코드는

private void Foo<T>(object o) where T : IComparable 
{ 
    T v1 = default(T); 
    T v2 = default(T); 
    if(v1.CompareTo(v2) != 0) 
    { 
     Console.WriteLine("Not Equal"); 
    } 
} 

private void Bar() 
{ 
    Foo<string>(new object()); 
} 
+0

이 코드가 필요 이상 더 구체적이다. 'IEquatable' 만 있으면됩니다. – luqui

+0

이것은 IComparable의 주문 기능이 실제로 필요하지 않을 때 유형에 대한 불필요한 제한 사항처럼 보입니다. –

+0

@Matt @luqui - 두 인터페이스가 선택을 제한하지 않습니까? 나는 당신이 IEquatable이 비교를위한 것이라는 것에 모두 동의하고, IComparable은 정렬을위한 것이라고 생각한다. 당신의 타입이 하나가 아니라 다른 것을 구현한다면 당신은 무슨 일이 있어도 당신의 사용 가능한 객체들을 필터링하게 될 것입니다. –

0

불행히도 하나는 없다고 생각합니다. .Equals()을 사용해야합니다.

0

당신은 모든 유형이 가지고있는 Equals() 인스턴스 메소드, 정적 Object.ReferenceEquals() 또는 Object.Equals() 방법을 사용할 수 컴파일 것, 또는 당신은 EqualityComparer<T>.Default.Equals() 방법을 사용할 수 있습니다. 당신이 성능 저하를 받아 들일 경우

0

, 당신은 내가 당신이 할 수 있다고 생각하지 않습니다

if (Comparer<T>.Default.Compare(value1, value2) == 0)) 
{ 
    Console.WriteLine("NOT EQUAL"); 
} 
+0

그건 재미 있어요. 나는 전에 그것을 본 적이 없다. 성능 저하의 원인은 무엇입니까? 왜 object.Equals를 사용하지 않습니까? –

0

사용할 수 있습니다. 연산자 제약과 같은 것은 없으므로! = 연산자가있는 객체 만 호출하도록 컴파일러에 지시 할 방법이 없습니다. .Equals 메서드는 기본 개체 클래스에 있기 때문에 사용할 수 있습니다.

여기 운영자 제약을 논의 기사입니다 : Operator Constraints

관련 문제