泛型比较抛出“至少有一个对象必须实现 IComparable”
本文关键字:一个对象 实现 IComparable 比较 泛型 | 更新日期: 2023-09-27 17:56:04
我的花式字段更新器抛出。
public static bool UpdateField<T>(ref T target, T value)
{
bool updated;
if (0 != Comparer<T>.Default.Compare(target, value))
{
target = value;
updated = true;
}
else
{
updated = false;
}
return updated;
}
我将这个更新程序用于"值类型","系统"引用类型"和我自己的"引用类型"。我的类型没有实现 IComparable,我不打算这样做。在这些情况下,通常只比较参考文献是可以接受的。
关键是我希望能够为我们做任何事情。是否有不同的实现允许我这样做,或者我是否必须捕获异常并尝试以不同的方式处理这些情况?
看起来你真的不想用"大于或小于"来比较这些值 - 而是为了相等。所以你应该使用EqualityComparer.Default
:
public static bool UpdateField<T>(ref T target, T value)
{
bool updated = !EqualityComparer<T>.Default.Equals(target, value);
if (updated)
{
target = value;
}
return updated;
}
默认相等比较器对类执行您想要的操作 - 如果类型没有实现IEquatable<T>
或覆盖object.Equals
,它会比较标识的引用。
您使用用于比较两个值(排序、大于、小于和等于)的比较器检查两个值是否相等。相反,请使用:
bool areEqual = EqualityComparer<T>.Default.Equals(target, value);
IComparer 接口支持排序比较。也就是说,当 比较方法返回 0,表示两个对象的排序相同。 精确相等比较的实现由IEqualityComparer 通用接口。
IComparable 是一个接口,可让您(开发人员)确定出于应用程序的目的,两个对象是否应被视为"相等"。 朋友,你可能不太抗拒使用这个接口,因为它有助于你必须做的工作,并且不需要你生成外部方法来比较你的对象。 try-catch 方法将起作用,但它很粗糙,您最终会将其剪切并粘贴到您的代码中。
考虑可维护性。