为了账号安全,请及时绑定邮箱和手机立即绑定

使用 C# 泛型的错误拳击警告?

使用 C# 泛型的错误拳击警告?

C#
翻过高山走不出你 2021-11-28 20:01:10
我正在尝试实现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);

    }

}


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信