我正在尝试从Equals
实现IEqualityComparer<T>
,如果T是引用类型,则返回ReferenceEquals
,如果T是值类型,则Equals
是返回。
所以我尝试这样做:
public bool Equals(T x, T y) {
if (typeof(T).IsValueType)
return Equals(x, y);
return ReferenceEquals(x, y);
}
我的推理是,如果x
和y
不是值类型,那么它们必须是引用类型,因此ReferenceEquals
不应装箱。
但是我得到这个警告:
装箱分配:从值类型“ T”转换为引用类型“ object”
答案 0 :(得分:2)
好吧,如果{em> T
不是一门课,那么有一个拳击应用。由于这些方法最有可能需要object
(特别是ReferenceEquals
),因此需要一些装箱才能调用这些方法。 (顺便说一下,您现在正在递归调用Equals
。)
如果使用class
约束,警告将消失(但显然,它与当前课程的可能性不完全匹配):
public class X<T> where T : class
{
public bool Equals(T x, T y) {
if (typeof(T).IsValueType)
return Equals(x, y);
return ReferenceEquals(x, y);
}
}