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

时间:2018-08-15 12:58:08

标签: c# generics reference boxing

我正在尝试从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);
}

我的推理是,如果xy不是值类型,那么它们必须是引用类型,因此ReferenceEquals不应装箱。

但是我得到这个警告:

装箱分配:从值类型“ T”转换为引用类型“ object”

1 个答案:

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