C# 암시 적 변환 및 == 연산자
-
23-08-2019 - |
문제
컨텍스트에 대한 일부 코드 :
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);