Я столкнулся с этим сегодня, когда проводил модульное тестирование универсального словаря.
System.Collections.Generic.Dictionary<int, string> actual, expected;
actual = new System.Collections.Generic.Dictionary<int, string> { { 1, "foo" }, { 2, "bar" } };
expected = new System.Collections.Generic.Dictionary<int, string> { { 1, "foo" }, { 2, "bar" } };
Assert.AreEqual(expected, actual); //returns false
Сбой
, за исключением случаев, когда actual == expected
(ссылки на объекты совпадают). Очевидно, actual.Equals(expected)
также возвращает false.
Хорошо, но если реализация System.Collections.Generic.Dictionary<int, string>.Equals
только ссылается на равенство, какой смысл IEquatable
? Другими словами, почему не существует встроенного способа сделать равенство значений для родовых коллекций?
Редактировать Спасибо за ответы до сих пор. Очевидно, мой пример использует типы значений, но я думаю, что моя жалоба относится ко всем объектам. Почему родовое равенство коллекций не может быть просто объединением равенств его типов? Неожиданное поведение на самом деле не сокращает его, поскольку существуют отдельные положения для нахождения ссылочного равенства. Я предполагаю, что это введет ограничение коллекций, содержащих только объект, который реализует IEquatable
, как указывает Конрад Рудольф. Тем не менее, в таком объекте, как словарь, это не так много, чтобы спросить.