下面给出代码,我想比较泛型类中的两个对象。
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'
}
有人可以解释为什么不能在这个泛型类中比较这两个对象吗?
答案 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 }} - 操作者:
==
这允许您为值类型和引用类型调用方法。