De acordo com a documentação do ==
operador no MSDN ,
Para tipos de valor predefinidos, o operador de igualdade (==) retornará true se os valores de seus operandos forem iguais, caso contrário, false. Para tipos de referência diferentes de string, == retorna true se seus dois operandos se referem ao mesmo objeto. Para o tipo de string, == compara os valores das strings. Os tipos de valores definidos pelo usuário podem sobrecarregar o operador == (consulte o operador). Os tipos de referência definidos pelo usuário também podem, embora por padrão == se comporte como descrito acima para os tipos de referência predefinidos e definidos pelo usuário.
Então, por que esse snippet de código falha na compilação?
bool Compare<T>(T x, T y) { return x == y; }
Eu recebo o erro Operador '==' não pode ser aplicado a operandos do tipo 'T' e 'T' . Eu me pergunto por que, desde que eu entenda, o ==
operador é predefinido para todos os tipos?
Edit: Obrigado a todos. Inicialmente, não percebi que a declaração se referia apenas a tipos de referência. Eu também pensei que a comparação bit a bit é fornecida para todos os tipos de valor, que agora sei que não estão corretos.
Mas, no caso de eu estar usando um tipo de referência, o ==
operador usaria a comparação de referência predefinida ou a versão sobrecarregada do operador se um tipo o definisse?
Edit 2: Por tentativa e erro, aprendemos que o ==
operador usará a comparação de referência predefinida ao usar um tipo genérico irrestrito. Na verdade, o compilador usará o melhor método possível para o argumento de tipo restrito, mas não procurará mais. Por exemplo, o código abaixo sempre será impresso true
, mesmo quando Test.test<B>(new B(), new B())
for chamado:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
==
não é permitido entre dois operandos do mesmo tipo. Isso vale para struct
tipos (exceto tipos "predefinidos") que não sobrecarregam o operator ==
. Como um exemplo simples, tente o seguinte:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
, então você não pode verificar kvp1 == kvp2
porque KeyValuePair<,>
é uma estrutura, não é um tipo predefinido de C # e não sobrecarrega o operator ==
. No entanto, é dado um exemplo var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
com o qual você não pode fazer e1 == e2
(aqui temos a estrutura aninhada List<>.Enumerator
(chamada "List`1+Enumerator[T]"
pelo tempo de execução) que não sobrecarrega ==
).
bool
de um void
...