평등을 위해 동일하지만 구속되지 않은 일반 유형의 두 요소를 비교하는 방법은 무엇입니까? [복제하다

StackOverflow https://stackoverflow.com/questions/336884

문제

가능한 복제 :
연산자 == C#의 일반 유형에 적용 할 수 없습니까?

다음과 같은 일반 클래스가 있고 컴파일러는이를 불평합니다.Operator '!=' cannot be applied to operands of type 'TValue' and 'TValue'" (보다 CS0019):

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {
            if (_value != value) // <<-- ERROR
            {
                _value= value;
                OnPropertyChanged("Value");
            }
        }
    }
}

내가 제한한다면 TValue 에게 class, 나는 사용할 수있다 Object.Equals(). 스트러크와 수업 모두에 이것을 필요로하기 때문에 그것을 피할 수 있다면 매우 행복 할 것입니다.

문제는 평등을 위해 동일하지만 구속되지 않은 일반 유형의 두 요소를 어떻게 비교할 수 있습니까?

도움이 되었습니까?

해결책

이런 식으로 시도 했어?

public class Example<TValue>
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (!object.Equals(_value, value))
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}

다른 팁

세 가지 옵션 :

  • TValue를 구현하도록 제한하십시오 IEquatable<TValue> 그런 다음 전화하십시오 x.Equals(y)
  • 유형의 다른 매개 변수를 가져옵니다 IEqualityComparer<TValue> 그리고 그것을 사용하십시오
  • 사용 EqualityComparer<TValue>.Default 비교를 수행합니다

물론 옵션 2와 3을 항상 믹싱하고 일치시킬 수 있습니다. 물론 기본 비교의 기본값은 특정 것을 제공 할 수 있습니다.

  • 값 유형의 경우 ()
  • 참조 유형의 참조 equals ()

icompartant is 옵션입니까?

public class Example<TValue> where TValue: IComparable
{
    private TValue _value;
    public TValue Value
    {
        get { return _value; }
        set
        {

            if (_value.CompareTo(value) != 0)
            {
                _value = value;
                OnPropertyChanged("Value");
            }
        }
    }
}

제 생각에는 != 사용할 수없는 경우가 있으므로 운영자는 여기에 적용 할 수 없습니다. 예를 들어, != 비교 연산자가 아니라면 스트러크를 비교하는 데 사용할 수 없습니다 (== !=) 과부하가 발생합니다.

물론, 당신은 다음과 같은 언어 structs를 비교할 수 있습니다. int != int, 그러나 이것이 어떻게 구현되는지 잘 모르겠습니다.

따라서 tvalue는 a 커스텀 구조, 그것은 사용할 수 없습니다 != 운영자.

public static bool operator ==(EntityBase<T> entity1, EntityBase<T> entity2)
        {
            if ((object)entity1 == null && (object)entity2 == null)
            {
                return true;
            }

            if ((object)entity1 == null || (object)entity2 == null)
            {
                return false;
            }

            if (Comparer<T>.Default.Compare(entity1.Id, entity2.Id) != 0)
            {
                return false;
            }

            return true;
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top