请考虑以下摘录 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。这似乎解决了覆盖版本。为什么呢?
感谢您的任何意见。