Ответ 1
Для 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
.