Удивительное равенство кортежей

До сегодняшнего дня мое понимание классов .NET Tuple заключалось в том, что они делегируют свою реализацию Equals () своему содержимому, что позволяет мне приравнять и сравните их «по значению».

Затем пришел этот тест и выставил меня дураком:

[TestMethod]
public void EquateTwoTuplesWithSameContent()
{
    var t1 = Tuple.Create("S");
    var t2 = Tuple.Create((object)t1.Item1);
    Assert.IsTrue(t1.Equals(t2)); // Boom!
}

Чтение документации MSDN и различных блогов оставило у меня больше вопросов. Из того, что я понял, может показаться, что Tuple и Tuple < TWither> всегда считаются неравными, независимо от того, что оба экземпляра могут заключать один и тот же объект (в рамке или приведении типов - это все одно и то же).

Действительно ли кортежи предполагаются именно так. вести себя? Является ли структурная совместимость на самом деле дополнительным ограничением равенства, а не ослаблением, как я интерпретировал до сих пор?

Если да, то есть ли что-нибудь еще в BCL, что я могу использовать для удовлетворения ожидания от вышеуказанного модульного теста?

Заранее благодарю!

27
задан aoven 21 February 2011 в 18:24
поделиться