通用比较抛出 "At least one object must implement IComparable."

Generic Compare throws "At least one object must implement IComparable."

我的 Fancy Field Updater 抛出错误。

    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;
    }

我将此更新程序用于 'Value Types'、系统 'Reference Types' 和我自己的 'Reference Types'。我的类型没有实现 IComparable,我也不打算这样做。在这些情况下,通常只比较参考文献是可以接受的。

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

看起来您并不是真的想根据 "greater than or less than" 来比较值 - 但为了相等。所以你应该使用 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.[=14=,它会比较标识的引用]

您正在使用 Comparer 检查两个值是否相等,Comparer 用于比较两个值(排序、大于、小于和等于)。相反,使用:

bool areEqual = EqualityComparer<T>.Default.Equals(target, value);

IComparer interface supports ordering comparisons. That is, when the Compare method returns 0, it means that two objects sort the same. Implementation of exact equality comparisons is provided by the IEqualityComparer generic interface.

IComparable 是一个接口,可让您(开发人员)确定两个对象是否应被视为 "equal"。朋友,您可能不太愿意使用接口,因为它简化了您必须做的工作,并且不需要您生成外部方法来比较您的对象。 try-catch 方法会起作用,但它很粗糙,您最终会在整个代码中剪切和粘贴它。

考虑可维护性。