Tuple.Equals没有检查确切类型的任何好理由?

wes*_*ton 6 c#

未检查类型可能导致不对称的相等:

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

运算符的求值顺序是从左到右