未检查类型可能导致不对称的相等:
public sealed class MyClass : Tuple<string>
{
private readonly int _b;
public MyClass(string a, int b) : base(a)
{
_b = b;
}
public override bool Equals(object obj)
{
return Equals(obj as MyClass);
}
private bool Equals(MyClass obj)
{
if (obj == null) return false;
return base.Equals(obj) && obj._b == _b;
}
}
[Test]
public void Show_broken_symmetric_equality()
{
Tuple<string> a = Tuple.Create("Test");
var b = new MyClass("Test", 3);
Assert.AreEqual(a, b);
Assert.AreNotEqual(b, a);
}
Run Code Online (Sandbox Code Playgroud)
该测试通过,但它不应该,它表明实现良好的对称属性Equals被打破.
查看代码Tuple是因为Tuple没有检查具体类型匹配,即没有相应的GetType() == obj.GetType().它通过检查检查可分配性,is但不比较类型.
我MyClass无法解决这种情况,因为不正确的行就是Assert.AreEqual(a, b);调用Tuple.Equals.并且,正如juharr指出的那样,MyClass.Equals在这种情况下改变为真,会打破传递性.
远射,但我想知道是否有人知道为什么它以这种方式实施?或者,如果以这种方式实施,它为什么没有密封.
小智 -4
请参阅 Tuple 类的源代码(第 100 行) http://referencesource.microsoft.com/#mscorlib/system/tuple.cs,2e0df2b1d6d668a0
运算符的求值顺序是从左到右
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |