为什么要调用这个版本的Equals?

时间:2015-12-03 16:48:29

标签: c# .net assert equals-operator

请考虑以下摘录 Matrix

// Both functions below are instance methods of a class Matrix

public bool Equals(Matrix m)
{
    if(m == null || this.RowDim != m.RowDim || this.ColDim != m.ColDim)
        return false;

    for(int i = 0; i < this.RowDim; ++i)
    {
        for(int j = 0; j < this.ColDim; ++j)
        {
            if(System.Math.Abs(this.rows[i][j] - m.rows[i][j]) > 1E-10)
                return false;
        }
    }
    return true;
}

// Overrides System.Object.Equals(object)
public override bool Equals(object obj)
{
    if(!(obj is Matrix))
        throw new InvalidCastException("Cannot cast object instance to instance of type Matrix.");
    return this.Equals((Matrix)obj);
}

问题1:鉴于以上情况,不应该是函数

public bool Equals(Matrix m)
当我们与Matrix类型的对象进行比较时,直接调用

? 重载函数的“最衍生”版本应该适用? (这里我的意思是Matrix是Object的后代)。 事实确实如此:

// m and m2 are instances of class Matrix
m.Equals(m2); // Calls Equals(Matrix)
m.Equals(new object()); // Calls Equals(object)

所以我用这个简单的测试来验证我自己的问题。

问题2: 但是,我有一个单元测试,看起来像

[TestMethod]
public void Test_Matrix_Equals()
{
    RL.Utility.Math.Matrix m = new RL.Utility.Math.Matrix(new double[,] { { 1.2, 3.2 }, { 4.5, 7.8 }, { 5.66, -19.2 } });
    RL.Utility.Math.Matrix m2 = new RL.Utility.Math.Matrix(new double[,] { { 1.2, 3.2 }, { 4.5, 7.8 }, { 5.66, -19.2 } });
    Assert.AreEqual<RL.Utility.Math.Matrix>(m, m2); // Equals(object) is called
}

为什么

public override bool Equals(object obj)

被叫而不是

public bool Equals(Matrix m)

?我可以理解为什么我使用了非通用版本的

Assert.AreEquals

因为其参数属于对象类型。但我使用通用版本,我在其中指定类型为Matrix:

Assert.AreEqual<Matrix>

MSDN

  

使用相等运算符验证两个指定的泛型类型数据是否相等。如果断言不相等,断言就会失败。

“平等运营商”究竟是什么意思?他们不能指

operator==

因为这将是类类型的引用相等,这违背了目的。那么剩下的就是调用Equals。这似乎解决了覆盖版本。为什么呢?

感谢您的任何意见。

0 个答案:

没有答案