2012-08-07 5 views
20

En la especificación de lenguaje C# versión 4, 1.6.7.5 Operadores es información sobre operadores List<T>: == y !=. Pero no puedo encontrar esos operadores definidos en List<T>? ¿Me estoy perdiendo de algo?Operador de lista <T> == En la especificación de idioma C# versión 0

código de ejemplo de 1.6.7.5 Operadores:

List<int> a = new List<int>(); 
a.Add(1); 
a.Add(2); 
List<int> b = new List<int>(); 
b.Add(1); 
b.Add(2); 
Console.WriteLine(a == b); // Outputs "True" => here I get False as well 
b.Add(3); 
Console.WriteLine(a == b); // Outputs "False" 
+0

Por favor, explique su pregunta con más claridad – darnir

+5

Por favor, no diga "Salidas" para "Me gustaría que .." :) –

+8

@pst Este código es copiado y pegado literalmente de la especificación del lenguaje, junto con el comentario. – dasblinkenlight

Respuesta

17

La especificación es realmente correcta, aunque confusa. La especificación define una clase llamada Lista (opción de denominación pobre).

La siguiente tabla muestra una clase genérica llamada Lista, que implementa una lista de objetos creíble. La clase contiene varios ejemplos de los tipos más comunes de miembros de funciones.

Esta clase se puede ver en la especificación en la sección 1.6.7. El operador Equals está sobrecargado y coincide con la salida explicada anteriormente. Tal vez un mejor nombre debería haber sido elegido para esa clase.

static bool Equals(List<T> a, List<T> b) { 
    if (a == null) return b == null; 
    if (b == null || a.count != b.count) return false; 
    for (int i = 0; i < a.count; i++) { 
     if (!object.Equals(a.items[i], b.items[i])) { 
      return false; 
     } 
    } 
    return true; 
} 
21

List<T> es un tipo de referencia que no sobrecargue operator==. Por lo tanto, usa la semántica de igualdad de referencia predeterminada. Parece tener la impresión de que anula operator== para proporcionar una semántica de valores, pero no es así. a equivaldrá a b cuando a y b ambos se refieren a la misma instancia List<T>.

EDITAR: Así que miré la especificación yo mismo. Dice:

La clase List declara dos operadores, operator == y operator! =, Y por lo tanto da un nuevo significado a las expresiones que aplican esos operadores a las instancias List. Específicamente, los operadores definen la igualdad de dos instancias de la Lista como la comparación de cada uno de los objetos contenidos usando sus métodos Equals. El siguiente ejemplo usa el operador == para comparar dos instancias de lista.

Honestamente ... No tengo ni idea de qué están hablando, pero esto no parece ser correcto. Por lo que puedo decir después de ejecutar algunas pruebas, la clase List<T> usa igualdad de referencia. Buena pregunta.

EDIT2: Descompilado List<T>, no operator== y/o operator!= sobrecarga. La especificación parece ser completamente incorrecta en este caso.

+1

La especificación del idioma dice lo contrario: "La clase List declara dos operadores, operator == y operator! =, Y así le da un nuevo significado a las expresiones que aplican esos operadores a las instancias de la Lista. Específicamente, los operadores definen igualdad de dos instancias de List al comparar cada uno de los objetos contenidos utilizando sus métodos Equals ". – dasblinkenlight

+0

@dasblinkenlight: Tienes razón, lo estoy leyendo ahora. Intentando darle sentido ... –

+0

@DanielDusek: Sí, acabo de agregar eso a mi publicación. Parece ser incorrecto La realidad no está en línea con la especificación. –

Cuestiones relacionadas