【问题标题】:Comparison of typed objects in generic class [duplicate]泛型类中类型化对象的比较[重复]
【发布时间】:2016-07-26 18:27:28
【问题描述】:

给出以下代码,我只想比较泛型类中的两个对象。

public bool Compare<T>()
    {
        T var1 = default(T);
        T var2 = default(T);        
        return var1 == var2;
        //Error CS0019  Operator '==' cannot be applied to operands of type 'T' and 'T'
    }

谁能解释为什么不能在这个泛型类中比较这两个对象?

【问题讨论】:

  • default(T) 只是作为一个例子,还是您想要比较的实际情况?否则,我会说它总是true,只要结构的实现者没有完全古怪地覆盖==

标签: c# generics types


【解决方案1】:

您不能在您的类型T 上使用== 运算符,因为不能保证该运算符是在该类型上定义的。例如,想象T 的类型为KeyValuePair。您不能编写以下内容:

var areEqual = (new KeyValuePair<string, string>("1", "1") == new KeyValuePair<string, string>("2", "2"))

对您的泛型类型(例如where T : new())进行一些限制,以仅允许默认值为null 的类。

编辑:仅对类的约束是毫无意义的,因为引用类型始终默认为 null,您可以将 T 的实例拆箱为 object,然后调用 ==-operator:

public bool Compare<T>()
{
    object var1 = default(T);
    object var2 = default(T);
    if (var1 == null) return var1 == var2;
    return var1.Equals(var2);
}

这允许您调用值类型和引用类型的方法。

【讨论】:

  • 如果 var1 为空怎么办?它不会工作
  • @MartinSwanepoel 好点,已更新。
  • 还是不行return var1 == var2;
  • @MartinSwanepoel ??当然,几秒钟前测试过。导致类似于return null == var2 的内容,如果var2 也是null,则返回true,否则返回false。还是我错过了什么?
【解决方案2】:

Type T 不一定是引用类型,T 是类型参数,可以是类或结构,因此编译器将无法做出该假设。

你可以这样做

public bool Compare<T>()
{           
        T var1 = default(T);
        T var2 = default(T);

        return !EqualityComparer<T>.Default.Equals(var1, var2);
}

您也可以尝试使 T IComparable&lt;T&gt; 或者您可以尝试使用 IComparer&lt;T&gt; 到您的班级。

【讨论】:

  • 这将使用Object.Equals(和Object.GetHashCode)作为T,除非T : IEquatable&lt;T&gt;,在这种情况下它使用它。
【解决方案3】:

快速选项:

public bool Compare<T>()
{
    var t1 = default(T);
    var t2 = default(T);
    return object.Equals(t1, t2);
}

一般正确的选项:

public bool Compare<T>()
{
    var t1 = default(T);
    var t2 = default(T);
    return EqualityComparer<T>.Default.Equals(t1, t2);
}

请注意下面的代码,因为如果变量 t1 为空,您将收到异常

public bool Compare<T>()
{
    var t1 = default(T);
    var t2 = default(T);
    return t1.Equals(t2);
}

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 2014-06-13
    • 2012-11-16
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多