2010-12-05 5 views
1

저는 기본 클래스 Class1과 파생 클래스 2를가집니다. class2의 두 인스턴스를 만들지 만 class1로 정의합니다. 제 문제는이 개체들 간의 제네릭 비교를 할 수 없다는 것입니다.정적 연산자 == 과대 평가 된 메서드를 검색하지 않습니다.

if (obj1 == obj2) 

에 대한 :

if ((Class2)obj1 == (Class2)obj2) 

모든 권리이지만, 강좌 3을 obj2보다 있습니다으로 obj1 경우 I 오류

를 얻을 내가 라인을 변경하는 경우

public class Class1 
    { 
     public int Property1 = 0; 
    } 

    public class Class2 : Class1 
    { 
     public int Property2 = 0; 

     public static bool operator ==(Class2 c1, Class2 c2) 
     { 
      return c1.Property2 == c2.Property2; 
     } 

     public static bool operator !=(Class2 c1, Class2 c2) 
     { 
      return c1.Property2 != c2.Property2; 
     } 
    } 

    public class Class3 : Class1 
    { 
     public int Property3 = 0; 
    } 

    static void Main(string[] args) 
    { 
     Class1 obj1 = new Class2(); 
     Class1 obj2 = new Class2(); 

     if (obj1 == obj2) 
     { 
      Console.WriteLine("Yes !!! The two objects are equal!"); 
     } 
     else 
     { 
      Console.WriteLine("The two objects are not equal."); 
     } 
    } 

: 다음은 예입니다

어떻게 해결할 수 있습니까?

당신에게

Crandel

+0

C# prvoide 표준 참조 == 자동으로 값 비교기를 수행하려고합니까? – rerun

+1

'오버로드'또는 '오버라이드'를 의미합니까? 과대 평가 된 것은 다른 것을 의미합니다. 어떤 오류가 발생하고 있습니까? – Oded

+0

정적 메소드가 오버로드되고 오버라이드되지 않는다는 것을 이해하는 한. 어쩌면 나는 오버라이드 된 결과를 기대할 것이다 : S. 나는 그것을 실제로 시도하지 않는다. 그러나 캐스트 에러라고 생각한다. – Crandel

답변

0

이 나쁜 생각은 내 생각에

+0

나는 모든 파생 클래스에서 연산자를 정의하여 자신의 속성을 비교할 수 있습니다. Class2는 Property1과 Property2를 비교할 수 있습니다. Class3은 Property1과 Property3을 비교할 수 있습니다. 하지만 기본 클래스에서 할 필요가 있습니다. – Crandel

0

을 작동하도록 할뿐만 아니라 Class1에 추가 귀하의 예제에서, 모든 클래스에 연산자 오버로드를 추가 감사 == 및! = 연산자를 오버로드하는 것은 참조 유형을 사용하는 기본 의미 체계가 값이 아닌 참조를 비교하기 때문입니다. 오히려 bool Equals (System.Object) 및 int GetHashCode()를 재정의하고 값 비교에 Equals를 사용합니다. IMHO는 모호성을 줄임으로써 코드를보다 읽기 쉽게 만듭니다.

+0

알아요,하지만 참조 유형을 비교하고 싶지는 않습니다. 어떤 때는 같은 객체에 대해 두 개의 인스턴스가 있으며 동일하거나 다른 인스턴스가있을 때이를 감지해야합니다. – Crandel

+1

[MSDN] (http://msdn.microsoft.com/en-us/library/ms173147.aspx) 권장 사항 : "형식이 변경되지 않으면 인스턴스에 포함 된 데이터를 변경할 수 없다는 것을 의미합니다. 오버로드 연산자'== '참조 equality 대신 값 평등을 비교하는 것은 유용 할 수 있습니다. 왜냐하면 불변 객체로서 같은 값을 가진다면 동일한 값으로 간주 될 수 있기 때문입니다. '=='연산자를 변경하지 않는 것이 좋습니다. " –

+0

나는 개체가 이미 존재하는지 감지하기 위해 대신 두 번째 개체를 만들 때 내 문제가 발생한다는 것에 동의한다. – Crandel