C# 泛型类中类型化对象的比较

C# 泛型类中类型化对象的比较,c#,generics,types,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' }

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

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'
    }
public bool Compare()
{
T var1=默认值(T);
T var2=默认值(T);
返回var1==var2;
//错误CS0019运算符“==”不能应用于“T”和“T”类型的操作数
}

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

您不能在您的类型
t
上使用
==
-运算符,因为无法保证该运算符是在该类型上定义的。例如,假设
T
属于
KeyValuePair
类型。不能写入以下内容:

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

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

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

你可以像我一样

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

        return !EqualityComparer<T>.Default.Equals(var1, var2);
}
public bool Compare()
{           
T var1=默认值(T);
T var2=默认值(T);
return!EqualityComparer.Default.Equals(var1,var2);
}
您也可以尝试使用T,或者您可以尝试对您的类使用A。

快速选项:

public bool Compare<T>()
{
    var t1 = default(T);
    var t2 = default(T);
    return object.Equals(t1, t2);
}
public bool Compare()
{
var t1=默认值(T);
var t2=默认值(T);
返回对象。等于(t1,t2);
}
一般正确选项:

public bool Compare<T>()
{
    var t1 = default(T);
    var t2 = default(T);
    return EqualityComparer<T>.Default.Equals(t1, t2);
}
public bool Compare()
{
var t1=默认值(T);
var t2=默认值(T);
返回EqualityComparer.Default.Equals(t1,t2);
}
请注意下面的代码,因为如果变量t1为null,您将收到一个异常

public bool Compare<T>()
{
    var t1 = default(T);
    var t2 = default(T);
    return t1.Equals(t2);
}
public bool Compare()
{
var t1=默认值(T);
var t2=默认值(T);
返回t1等于(t2);
}

默认值(T)只是一个例子,还是您想要比较的实际情况?否则,我会说只要结构的实现者在重写
==
时没有完全离奇,它总是
正确的
。这将使用
对象.Equals
(和
对象.GetHashCode
)表示
t
,除非
t:IEquatable
,在这种情况下它会使用它。如果var1为null呢?不会的work@MartinSwanepoel很好,已经更新了。仍然不起作用
returnvar1==var2@MartinSwanepoel??当然,几秒钟前测试过了。导致类似于
returnnull==var2
的结果,如果
var2
也为
null
,则返回true,否则返回false。还是我错过了什么?
public bool Compare<T>()
{
    var t1 = default(T);
    var t2 = default(T);
    return t1.Equals(t2);
}