泛型比较抛出“至少有一个对象必须实现 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,我不打算这样做。在这些情况下,通常只比较参考文献是可以接受的。

关键是我希望能够为我们做任何事情。是否有不同的实现允许我这样做,或者我是否必须捕获异常并尝试以不同的方式处理这些情况?

泛型比较抛出“至少有一个对象必须实现 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 方法将起作用,但它很粗糙,您最终会将其剪切并粘贴到您的代码中。

考虑可维护性。