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

标签 c# generics 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;
    }

我将此更新程序用于“值类型”、系统“引用类型”和我自己的“引用类型”。我的类型没有实现 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 .

关于c# - 通用比较抛出 "At least one object must implement IComparable.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38251634/

相关文章:

c# - 如何使用 IComparable 接口(interface)?

c# - 在磁盘上找到 Blazor Webassembly 下载的 .dll 文件?

generics - 如何将某种通用闭包传递给函数以生成特定值

java - Moshi 无法使用泛型为类创建转换器

swift - 使用带有类型别名的协议(protocol)作为属性

c# - 对集合进行排序时调用 CompareTo 方法多少次?

c# - 重新启动由 C# 控制台应用程序托管的 WCF 服务

c# - 如何在 ASP.NET Core 中使用模型验证来验证所需的查询字符串字段

c# - Enterprise Library Unity 和数据访问 block