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

我正在尝试实现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”到引用类型“对象”的转换


翻过高山走不出你
浏览 162回答 1
1回答

慕村9548890

好吧,如果 T不是类,则应用拳击。由于这些方法最有可能调用object(特别ReferenceEquals是调用),因此调用这些方法需要一些装箱操作。(顺便说一下,您Equals现在正在递归调用。)如果您使用class约束,警告将消失(但显然,它与您当前类的可能性不完全匹配):public class X<T> where T : class{&nbsp; &nbsp; public bool Equals(T x, T y) {&nbsp; &nbsp; &nbsp; &nbsp; if (typeof(T).IsValueType)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return Equals(x, y);&nbsp; &nbsp; &nbsp; &nbsp; return ReferenceEquals(x, y);&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP