2011-09-11 6 views
0

외부 나는 다음과 같은 시나리오가 :C#의 오버로딩 연산자 == 클래스

public class SomeClass { 
     // Have some other data members as well 
     public int i ; 
    } 

    public class TestClass { 

     public bool SomeFunction() { 
      SomeClass a = new SomeClass(); 
      SomeClass b = new SomeClass(); 
      if (a == b) // this is where I am getting compile error 
       return true; 
      return false; 
     } 

     public static bool operator==(SomeClass a, SomeClass b) { 
      if (a.i == b.i) 
       return true; 
      // compare some other members as well 
      return false; 
     } 
    } 

는 C#으로 달성이 가능합니까?

도움 주셔서 감사합니다.

+0

왜 클래스를 벗어나고 싶습니까? –

+0

실제 코드에서 "SomeClass"위의 예에서 클래스가 다른 사람의 것으로서 유효성을 검사하려고하기 때문에 – test123

답변

1

이 아니, 조작에 관여되지 않은 클래스에서 연산자를 대체 할 수는 없습니다 : 여기

는 코드, 개정 작업입니다.


당신은 사전에 예를 들어, 어떤 경우에는 표준 비교를 대신 사용할 수 있습니다 IEualityComparer<SomeClass>를 구현하는 클래스를 만들 수 있습니다

:

var x = new Dictionary<SomeClass, string>(new SomeClassEqualityComparer()); 

방금 ​​원하는 경우 자신의 클래스에서 비교를 사용하면 연산자를 재정의하는 대신 일반 정적 메서드로 만들 수 있습니다.

public static bool SomeClassEqual(SomeClass a, SomeClass b) { 
    if (a.i == b.i) { 
    return true; 
    } 
    // compare some other members as well 
    return false; 
} 

사용법 :

if (SomeClassEqual(a, b)) 
+0

답변 해 주셔서 감사합니다. 그것이 내가 알고 싶었던 것입니다. 그래서 나는 비교를하기 위해 어리석은 함수를 써야 할 것 같아요. 알았어. – test123

+1

나는 'IEquatable '이 아니라 ['IEqualityComparer '] (http://msdn.microsoft.com/en-us/library/ms132151.aspx)라고 생각합니다. 전자는 특정 유형의 두 객체를 비교하는 데 사용되지만 후자는 특정 유형의 다른 객체를 'IEquatable '을 구현하는 객체와 비교하는 데 사용됩니다. 즉, 동등 비교자는 동등성 테스트의 당사자가 아니지만 동등한 비교자가됩니다. – cdhowie

+0

@cdhowie : 네, 맞습니다. – Guffa

1

처음에는 void 방법에 return true;을 사용할 수 없습니다.

두 번째로 재정의 연산자가 호스트 클래스에 적용되어야합니다. 귀하의 경우 TestClass 대신 SomeClass 내부가 아닌 내부에 있습니다.

세 번째로 == 연산자를 구현할 때 !=도 구현해야합니다.

public class SomeClass 
{ 
    // Have some other data members as well 
    public int i; 

    public static bool operator ==(SomeClass a, SomeClass b) 
    { 
     if (a.i == b.i) 
      return true; 
     // compare some other members as well 
     return false; 
    } 

    public static bool operator !=(SomeClass a, SomeClass b) 
    { 
     return !(a == b); 
    } 
} 

public class TestClass 
{ 

    public bool SomeFunction() 
    { 
     SomeClass a = new SomeClass(); 
     SomeClass b = new SomeClass(); 
     if (a == b) // this is where I am getting compile error 
      return true; 

     return false; 
    } 
} 
+1

죄송합니다. 이것은 단지 샘플 코드 일뿐입니다. 나는 고칠 것이다. 감사! – test123

+0

예, 호스트 클래스 외부의 운영자를 무시할 수 있는지 확인하고 싶습니다. – test123

+0

업데이트 된 코드를 보내 주셔서 감사합니다. 실제로 나는 그 클래스들을 실제 클래스 안에 넣는 것이 효과가 있다는 것을 압니다. 실제로 내 질문은 호스트 클래스 외부에서 무시하려고하면 작동 할 수 있는지 여부입니다. 하지만 @Guffa가 대답하는 것은 불가능하다고 생각합니다. 어쨌든 회신 해 주셔서 감사합니다. – test123