평등을 위해 동일하지만 구속되지 않은 일반 유형의 두 요소를 비교하는 방법은 무엇입니까? [복제하다
문제
가능한 복제 :
연산자 == 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;
}
제휴하지 않습니다 StackOverflow