우선 - c#+연산자




C#, 복수== 연산자 모호한 검사없이 오버로드 (2)

나는 전체 디자인을 다시 시작하겠습니다. 다른 유형 사이에 값 의미를 가진 == 을 구현하지 않을 것입니다. 오히려 혼란스러워 할 것입니다 : instaceTypedA == instanceTypedB 는 (적어도 저에게) 평등 참조 instaceTypedA == instanceTypedB 소리 instaceTypedA == instanceTypedB .

이 작업이 필요하면 VectorIVectorF 사이의 암시 적 변환을 구현 VectorF . 이것이 프레임 워크가 작동하는 방식입니다. 다음을 수행 할 때 :

int i = 1;
double d = 1;
var b = i == d;

oveload ==(int, double) 는 마술처럼 생성되지 않습니다. 무슨 일이 생기면 i 암묵적으로 double 로 변환되고 ==(double, double) 이 호출됩니다.

소개 :
동일한 작업을하지만 값 유형이 다른 몇 가지 클래스가 있습니다 (예 : 부동 소수점 또는 정수의 벡터).
이제 평등을 검사 할 수 있기를 원합니다.이 평등은 벡터 형식 (예 : vectorF == vectorI) 사이에서 작동해야합니다.
또한 null 검사 (vectorF == null)를 수행 할 수 있어야합니다.

접근 방식 :
내 접근 방식은 각각의 가능한 조합에 대해 하나씩, == 및! = 연산자에 대해 여러 오버로드를 작성하는 것입니다.

public sealed class VectorF
{
    [...]

    public static bool operator == (VectorF left, VectorI right)
    {
        // Implementation...
    }

    public static bool operator == (VectorF left, VectorF right)
    {
        // Implementation...
    }

    // Same for != operator
    [...]
}

문제 :
여러 오버로드를 사용하면 호출이 모호하므로 == 연산자로 null 체크 만 할 수 없습니다.

var v = new VectorF([...]);

if (v == null)    // This call is ambiguous
[...]

대신 ReferenceEquals 또는 null 캐스팅을 사용할 가능성을 알고 있지만이 접근법은 심각한 제한 사항입니다.

var v = new VectorF([...]);

if(object.ReferenceEquals(v, null))    // Would work, is not user friendly.
[...]

if(v == (VectorF)null)    // Would also work, is neither user friendly.
[...]

질문 :
거기에 == 연산자를 구현하는 방식으로, 그것은 간단한 null 검사를 허용하고 다른 벡터 사이의 동등한 검사를 허용합니까?

다른 방법으로, 이것을 구현할 수있는 방법이 있습니까?


다음을 사용하여 비교를 되돌릴 수 있습니다.

if (v is VectorF)

vnull 이면이 점검은 실패합니다.





null-check