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);
}