문제

컨텍스트에 대한 일부 코드 :

class a
{

}

class b
{
    public a a{get;set;}
    public static implicit operator a(b b)
    {
        return b.a;
    }
}

  a a=null;
  b b=null;
  a = b;

  //compiler: cannot apply operator '==' to operands of type tralala...
  bool c = a == b; 

다른 유형 인스턴스에서 == 운영자를 사용할 수 있습니까? 내가 놓친 게 무엇입니까?

편집하다:
유형이 동일한 호출 ==이어야하는 경우

int a=1;
double b=1;
bool c=a==b; 

공장?

도움이 되었습니까?

해결책

그만큼 implicit 운영자는 과제 만 작동합니다.

평등을 과부하하려고합니다 (==) 운영자 :

class a
{
    public static bool operator ==(a x, b y)
    {
        return x == y.a;
    }

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

class b
{
    public a a{get;set;}
    public static implicit operator a(b b)
    {
        return b.a;
    }
}

그런 다음 두 가지 유형 객체를 비교할 수 있어야합니다. a 그리고 b 귀하의 게시물에서 제안한대로.

var x = new a();
var y = new b();
bool c = (x == y); // compiles

메모:

나는 단순히 그것을 무시하는 것이 좋습니다 GetHashCode 그리고 Equals 방법, 컴파일러가 경고하는 것처럼, 그러나 당신이 그것들을 억압하고 싶을 때, 당신은 다음과 같이 할 수 있습니다.

수업 선언을 변경하십시오 a 에게:

#pragma warning disable 0660, 0661
class a
#pragma warning restore 0660, 0661
{
    // ...
}

다른 팁

다른 유형 인스턴스에서 == 운영자를 사용할 수 있습니까?

예.

내가 놓친 게 무엇입니까?

사양의 관련 부분은 다음과 같습니다. 당신은 강조 표시된 단어를 놓쳤습니다.

사전 정의 된 참조 유형 평등 연산자는 두 피연산자 모두 참조 유형 값 또는 문자 그대로 널이라는 것을 요구합니다. 또한, a 기준암시 적 변환은 피연산자의 유형에서 다른 피연산자의 유형까지 존재합니다.

사용자 정의 변환은 정의상 표준 변환이 아닙니다. 이들은 참조 유형입니다. 따라서 사전 정의 된 참조 유형 평등 연산자는 후보가 아닙니다.

유형이 동일한 호출 ==이어야한다면 [double == int]가 작동하는 이유는 무엇입니까?

유형이 동일해야한다는 가정이 올바르지 않습니다. INT에서 두 배로의 표준 암시 적 변환이 있으며 두 번의 복식이 필요한 평등 연산자가 있으므로 작동합니다.

나는 당신 도이 비트를 놓친 것 같아요 :

사전 정의 된 참조 유형 평등 연산자를 사용하여 컴파일 타임에서 다른 것으로 알려진 두 참조를 비교하는 것은 컴파일 타임 오류입니다. 예를 들어, 피연산자의 컴파일 타임 유형이 2 개의 클래스 유형 A와 B이며 A와 B가 다른 것과 비슷하지 않으면 두 피연산자가 동일한 물체를 참조하는 것은 불가능합니다. 따라서 작업은 컴파일 타임 오류로 간주됩니다.

관심있는 유형의 == 연산자를 실제로 무시해야한다고 생각합니다. 유형이 암시 적 변환 가능한 경우에도 컴파일/런타임이 여전히 불만을 제기 할 수 있습니다.

public static bool operator ==(a a, b b)
    {
        //Need this check or we can't do obj == null in our Equals implementation
        if (((Object)a) == null)
        {
            return false;
        }
        else
        {
            return a.Equals(b);
        }
    }

또는 Ole6ka와 같은 동등한 구현을 사용하고 구현이 필요한 유형 주조를 수행하는지 확인하십시오.

http://msdn.microsoft.com/en-us/library/8edha89s.aspx

각각의 경우, 하나의 매개 변수는 연산자를 선언하는 클래스 또는 구조물과 동일한 유형이어야합니다 (...)

이것을 사용하십시오

 bool c = a.Equals(b);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top