Для Tuple == сравнивает ссылки на объекты, потому что он не перегружает оператор ==
.Поскольку объекты эквивалентны, но не являются одним и тем же конкретным экземпляром, Equals()
возвращает true
, а ==
возвращает false
.
Многие типы не перегружают ==
, некоторые предпочитают сохранять различиемежду Equals()
для эквивалентности и ==
для ссылочного равенства.
Кроме того, использование ==
для эквивалентности может привести к некоторой странности:
public bool AreSame<T>(T first, T second) where T : class
{
return first == second;
}
Приведенный выше код всегда проверяет равенство ссылок, поскольку неограниченный родовой объект считается object
во время компиляции, таким образом, если метод не является виртуальным, вы получите версию объекта (даже если тип, такой как string
перегружает ==
).
Таким образом, это использование приведенного выше кода:
var x = "Hello";
var y = "H";
// doing concat to avoid string interring
AreSame(x, y+"ello");
Да, строки эквивалентны, да T
равно string
, но ==
привязано к ==
объекта, так как универсальный тип не ограничен, таким образом, это вернет false
дажехотя тот же код с явными string
параметрами вернет true
.