Pregunta

En VisualStudio (Pro 2008), acabo de notar un comportamiento inconsistente y me pregunté si había algún razonamiento lógico detrás de esto.

En un proyecto de WinForms, si uso la línea

if(myComboBox.Items[i] == myObject)

Recibo una advertencia del compilador de que podría obtener 'Posibles referencias no deseadas' mientras comparo el tipo de objeto con el tipo MyObject.Me parece bien.

Sin embargo, si en lugar de eso uso una interfaz para comparar:

if(myComboBox.Items[i] == iMyInterface)

la advertencia de compilación desaparece.

¿Alguien puede pensar si hay alguna razón lógica por la que esto debería suceder, o simplemente un artefacto del compilador para no verificar las interfaces en busca de advertencias de comparación?¿Alguna idea?

EDITAR En mi ejemplo, el cuadro combinado estaba vinculado a una Lista, pero esa lista se generó usando list<IMyInterface>.Cast<MyObject>().ToList<MyObject>()

Es como si el compilador solo estuviera tomando todavía asumiendo que estoy vinculando a la Lista de IMyInterface.

(Los métodos de Objeto e Interfaz han sido cambiados para proteger a los inocentes)

¿Fue útil?

Solución

La advertencia de compilación para el primer ejemplo se debe a que cualquier operador == personalizado para su clase se ignoraría y se compararían las referencias (tal vez no sea lo que pretendía, de ahí la advertencia).

No es posible especificar que un operador deba anularse en una interfaz, por lo que esto siempre ser una comparación de referencia.La advertencia no es necesaria porque siempre se debe esperar esto.

A continuación se muestra un ejemplo de cómo anular el operador ==:

class Program
{
    static void Main(string[] args)
    {
        object t1 = new MyTest() { Key = 1 };
        MyTest t2 = new MyTest() { Key = 1 };

        Console.WriteLine((MyTest)t1 == t2); // Uses overriden == operator, returns true
        Console.WriteLine(t1 == t2); // Reference comparison, returns false
    }
}

public class MyTest
{
    public int Key { get; set; }

    public override bool Equals(object obj)
    {
        return this.Key == (obj as MyTest).Key;
    }

    public override int GetHashCode()
    {
        return this.Key.GetHashCode();
    }

    public static bool operator ==(MyTest t1, MyTest t2)
    {
        return t1.Equals(t2);
    }

    public static bool operator !=(MyTest t1, MyTest t2)
    {
        return !t1.Equals(t2);
    }

}

La clase MyTest se considera igual si la propiedad Key es igual.Si tuviera que crear una interfaz, no puede especificar que incluya un operador == personalizado y, por lo tanto, la comparación siempre sería una comparación de referencia (y, por lo tanto, falsa en el caso de nuestro código de muestra).

Otros consejos

Lagerdalek,

La advertencia se genera porque necesita convertir el elemento de la colección Elementos al tipo original que estaba vinculado al cuadro combinado, antes de comparar;de lo contrario, puede obtener resultados inesperados, como advierte el compilador.

Aquí hay un ejemplo:

myComboBox.DataSource = Collection<Car>;

Entonces, si el cuadro combinado está vinculado a una colección de auto objetos que los devolverías antes de compararlos:

if((car)myComboBox.Items[i] == thisCar)

Entonces no deberías recibir ninguna advertencia.

Otro método que podrías hacer es:

using(myComboBox.Items[i] as car){
 if(myComboBox.Items[i] == thisCar)
}

Hágamelo saber.¡Buena suerte!Voy de memoria, espero no haber escrito mal nada.:u)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top