泛型类

时间:2016-04-06 11:22:11

标签: c# generics types

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

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

有人可以解释为什么不能在这个泛型类中比较这两个对象吗?

3 个答案:

答案 0 :(得分:1)

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

你可以这样做

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

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

您也可以尝试制作T IComparable<T>,否则您可以尝试在课堂上使用IComparer<T>

答案 1 :(得分:0)

快速选项:

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为null,您将收到异常

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

答案 2 :(得分:-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,然后调用{{1 }} - 操作者:

==

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