Как сравнить два элемента одного и того же, но неограниченного общего типа для равенства?
Возможный дубликат:
Оператор Cant == применяется к общим типам в С#?
У меня есть следующий общий класс, и компилятор жалуется, что "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()
. Поскольку мне это нужно для обеих структур и классов, я был бы очень счастлив, если бы мог это избежать.
Итак, вопрос в том, как я могу сравнить два элемента одного и того же, но неограниченного общего типа для равенства?
Ответы
Ответ 1
Вы попробовали что-то вроде этого?
public class Example<TValue>
{
private TValue _value;
public TValue Value
{
get { return _value; }
set
{
if (!object.Equals(_value, value))
{
_value = value;
OnPropertyChanged("Value");
}
}
}
}
Ответ 2
Три варианта:
- Ограничьте TValue для реализации
IEquatable<TValue>
, а затем вызовите x.Equals(y)
- Возьмите другой параметр типа
IEqualityComparer<TValue>
и используйте
- Используйте
EqualityComparer<TValue>.Default
для выполнения сравнений
Вы всегда можете смешивать и сопоставлять варианты 2 и 3, конечно же - по умолчанию - по умолчанию, а также разрешать конкретный вариант.
Ответ 3
- Equals() для типов значений
- ReferenceEquals() для ссылочных типов
Ответ 4
Является ли IComparable опцией?
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");
}
}
}
}
Ответ 5
Я думаю, что оператор !=
не может применяться здесь, потому что есть случаи, когда он не может быть использован. Например, !=
не может использоваться для сравнения структур, если только операторы сравнения (==
!=
) не перегружены.
Конечно, вы можете сравнивать языковые структуры, например int != int
, но я не уверен, как это реализовано.
Итак, поскольку TValue может быть настраиваемой структурой, он не может использовать оператор !=
.
Ответ 6
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;
}