Este fragmento de código es de C# en Profundidadsobrecarga de operadores en genéricos Métodos
static bool AreReferencesEqual<T>(T first, T second)
where T : class
{
return first == second;
}
static void Main()
{
string name = "Jon";
string intro1 = "My name is " + name;
string intro2 = "My name is " + name;
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2));
}
La salida del fragmento de código anterior es
True
False
Cuando se cambia el método principal para
static void Main()
{
string intro1 = "My name is Jon";
string intro2 = "My name is Jon";
Console.WriteLine(intro1 == intro2);
Console.WriteLine(AreReferencesEqual(intro1, intro2));
}
La salida del fragmento de código anterior es
True
True
No puedo entender por qué?
EDITAR: Una vez que comprenda la interferencia de cadenas, las siguientes preguntas no se aplican.
¿Cómo se reciben los parámetros en el método genérico
AreReferencesEqual
en el segundo fragmento de código?
¿Qué cambios en el tipo de cadena cuando se concatena para que el operador == no llame al método Equals sobrecargado del tipo String?
Recuerde, _generics_ no son _templates_. El compilador sobrecarga la resolución en el operador == UNA VEZ y TODAS las construcciones genéricas usan el resultado de ese análisis. No hacemos un análisis para Comparar y otro para Comparar y un tercero para Comparar . Hacemos el análisis UNA VEZ. Al comparar T con T donde se sabe que T es cualquier clase, lo único que podemos hacer es hacer que == signifique "comparar por referencia". Por lo tanto, SIEMPRE significa "comparar por referencia" sin importar lo que T sea. –