1

有一个很好的解释为什么object.ReferenceEquals(this, obj)不能用于值类型:

使用 ReferenceEquals 比较值时,如果 objA 和 objB 是值类型,则在将它们传递给 ReferenceEquals 方法之前将它们装箱。这意味着即使 objA 和 objB 都表示值类型的同一实例,ReferenceEquals 方法仍然返回 false

但是,我发现类似于以下代码段的代码:

internal readonly struct Foo
{
    public override bool Equals(object obj)
    {
        if (object.ReferenceEquals(this, obj))
        {
            return true;
        }

        if (obj is Foo other)
        {
            return this.Equals(other);
        }

        return false;
    }

    public bool Equals(Foo other)
    {
        // ..
        return true;
    }
}

这是错误的还是存在ReferenceEquals对值类型,尤其是结构有用(即评估为真)的边缘情况?

4

1 回答 1

4

不应该。编写的代码很糟糕,因为它不必要地为永远无法工作的测试打包了一些东西。为了完整起见,在这种情况下,更有用和惯用的模式是:

// custom Foo equality implementation
public bool Equals(Foo other)
{
    // ...
}
// default object implemenentation
public override int GetHashCode() {...} // must match Equals(Foo) logic
public override bool Equals(object obj) => obj is Foo other && Equals(other);
于 2021-04-08T16:14:19.200 回答