Generic Compare throws"至少有一个对象必须实现IComparable。"

时间:2016-07-07 17:22:22

标签: c# generics icomparable

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

我将此更新程序用于&#39;值类型&#39;,系统&#39;参考类型&#39;和我自己的参考类型&#39;。我的类型没有实现IComparable,我也不打算这样做。在这些情况下,通常可以比较参考文献。

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

3 个答案:

答案 0 :(得分:4)

看起来你真的不想用“大于或小于”来比较这些值 - 而是为了平等。所以你应该使用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,它会比较标识的引用。

答案 1 :(得分:1)

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

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

IComparer接口支持订购比较。也就是说,当   Compare方法返回0,表示两个对象排序相同。    提供了完全相等比较的实现    IEqualityComparer泛型接口。

答案 2 :(得分:-3)

IComparable是一个界面,让您(开发人员)确定是否应将两个对象视为&#34;等于&#34;。您可能对使用界面朋友的抵抗力稍差,因为它有助于您必须完成的工作,并且不需要您生成外部方法来比较对象。 try-catch方法可行,但它很粗糙,你最终会在代码中剪切和粘贴它。

考虑可维护性。