Pergunta

Em VisualStudio (Pro 2008), eu só notei alguns comportamentos incoerentes e perguntou se havia qualquer raciocínio lógico por trás dele

Em um projeto WinForms, se eu usar a linha

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

Eu recebo um aviso do compilador que eu poderia ter 'referências não intencionais possíveis' como eu estou comparando tipo de objeto para digitar MyObject. bastante justo.

No entanto, se eu passar a usar uma interface para comparar com:

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

o aviso de compilação vai embora.

Alguém pode pensar se há alguma razão lógica para que isso deve acontecer, ou apenas um artefato do compilador para não verificar as interfaces para avisos de comparação. Quaisquer pensamentos?

Editar No meu exemplo, a caixa de combinação foi obrigado a uma lista, mas essa lista foi gerada usando list<IMyInterface>.Cast<MyObject>().ToList<MyObject>()

É como se o compilador só é tomar ainda supondo que eu estou de ligação à Lista de IMyInterface.

(métodos de objeto e interface foram alterados para proteger os inocentes)

Foi útil?

Solução

O aviso de compilação para a primeira amostra é porque qualquer operador personalizado == para sua classe seria ignorado e as referências comparação (talvez não o que você pretendia, daí o aviso).

Não é possível especificar que um operador deve ser substituído em uma interface, para que isso irá sempre ser uma comparação de referência. A advertência não é necessária porque você deve sempre esperar isso.

Aqui está um exemplo de substituir o 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);
    }

}

A classe MyTest é considerado igual se a propriedade Key é igual. Se você fosse criar uma interface, você não pode especificar que ele deve incluir um operador personalizado == e, portanto, a comparação seria sempre uma comparação de referência (e, portanto, falsa no caso do nosso código de exemplo).

Outras dicas

Lagerdalek,

O aviso é gerado porque você precisa para lançar o item da parte de trás coleção de itens para o tipo de original que foi obrigado a caixa de combinação, antes de comparar; caso contrário, você pode obter resultados inesperados, como o compilador avisa.

Aqui está um exemplo:

myComboBox.DataSource = Collection<Car>;

Então, se a caixa de combinação está vinculado a uma coleção de carro objetos que você iria lançá-los de volta antes da comparação:

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

Em seguida, você não deve ter quaisquer avisos.

Outro método que você poderia fazer é:

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

Deixe-me saber. Boa sorte! Eu estou indo de memória, eu espero que eu não erra nada. : O)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top