我正在尝试实现Equalsfrom 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”到引用类型“对象”的转换
1 回答
慕村9548890
TA贡献1884条经验 获得超4个赞
好吧,如果 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);
}
}
- 1 回答
- 0 关注
- 161 浏览
添加回答
举报
0/150
提交
取消