Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Covariância e referência

Alguém pode me explicar o resultado desse código: O listaObj parece guardar duas referências

    static void Main(string[] args)
        {
            List<string> primeira = new List<string>() { "A", "B" };

            IEnumerable<object> listaObj = primeira;

            IEnumerable<object> segunda = new List<object> { 1, "D", 2.7 };

            listaObj = listaObj.Union(segunda);

            foreach (var item in listaObj)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine();
            primeira.Add("teste");

            foreach (var item in listaObj)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine();

            foreach (var item in primeira)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }

A
B
1
D
2,7

A
B
teste
1
D
2,7

A
B
teste
4 respostas
solução!

Olá, Marcio

Eu criei um Dotnetfiddle com o seu código, dê uma olhada:

https://dotnetfiddle.net/YLngsO

O que acontece é que listaObj está armazenando uma definição de consulta, e não uma lista. Qual a diferença? Uma lista guarda os dados concretos, enquanto uma definição de consulta guarda o algoritmo usado para obter dados. Por isso, sempre que você altera a lista primeira e em seguida varre a listaObj, o .NET vai obter os dados mais recentes de primeira.

Fala Marcelo, tudo bom?

Eu, erroneamente, acreditava que consulta realmente não seria executada no momento da definição, mas apenas na primeira vez em que fosse requerida. Obrigado pelo esclarecimento.

O que mais me deixou intrigado é que, é atribuído ao listaObj uma definição de consulta ao qual ele faz parte, e ainda assim manteve uma ligação com o objeto de sua primeira atribuição. Vou ser ainda mais cuidadoso ao lidar com esse tipo de estrutura.

Valeu!!

Legal, Marcio! Podemos fechar a dúvida então?

Quando ao uso de consultas, a gente sugere os cursos de LINQ da Alura, que abordam esse assunto com mais profundidade:

https://www.alura.com.br/curso-online-linq-c-sharp https://www.alura.com.br/curso-online-linq-c-sharp-parte-2

Um abraço!

Opa! esqueci de fechar. Vou me aprofundar sim Marcelo.

Um abraço

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software