如何比较相同但不受约束的泛型类型的两个元素是否相等?[复制]
题
可能的重复:
运算符 == 不能应用于 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()
- ReferenceEquals() 用于引用类型
时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");
}
}
}
}
我觉得!=
操作者可以因为有它无法使用的情况下不应用在这里。例如,!=
不能用于比较结构中,除比较运算符(==
!=
)的过载。
当然,你可以比较的语言结构,像int != int
,但我不知道这是如何实现的。
所以,因为TValue可以是定制结构,它不能使用!=
运算符。
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