Tuple == Confusão

Suponha que eu defina duas tuplas:

Tuple tuple1 = new Tuple(1.0f, 2.0f, 3.0f, 4.0f); Tuple tuple2 = new Tuple(1.0f, 2.0f, 3.0f, 4.0f); 

Se eu tentar comparar as tuplas, obtenho resultados diferentes

 bool result1 = (tuple1 == tuple2); // FALSE bool result2 = tuple1.Equals(tuple2); // TRUE 

Eu esperaria que as duas chamadas retornassem como verdadeiras. O que exatamente é == comparando?

Para Tuple, o == está comparando as referências de object porque não sobrecarrega o operador == . Como os objects são equivalentes, mas não a mesma instância específica, Equals() retorna true e == retorna false .

Muitos tipos não sobrecarregam == , alguns preferem manter uma distinção entre Equals() para equivalência e == para igualdade de referência.

Além disso, confiar em == para equivalência pode levar a alguma estranheza:

 public bool AreSame(T first, T second) where T : class { return first == second; } 

O código acima sempre verificará a igualdade de referência porque um genérico irrestrito é considerado um object em tempo de compilation, portanto, se o método não for virtual, você obterá a versão do object (mesmo se o tipo, como sobrecargas de string == ).

Assim, este uso do código acima:

 var x = "Hello"; var y = "H"; // doing concat to avoid string interring AreSame(x, y+"ello"); 

Sim, as strings são equivalentes, sim T é string , mas o == está ligado ao object == já que o genérico é irrestrito, portanto isso retornará false mesmo que o mesmo código com parâmetros de string explícitas retorne true .

== está comparando referências de objects. A class Tuple não sobrecarrega o operador == , então você precisa usar .Equals .

== para Tuple só verá as referências e, portanto, você verá que é falso.

PS: A maneira recomendada é fazer algo como:

 var tuple1 = Tuple.Create(1.0f, 2.0f, 3.0f, 4.0f)