Respondendo então à questão de qual overload é utilizado que fiz aqui na quinta-feira passada. Se você não viu a questão, leia lá antes de ler aqui para não perder a graça.

Revendo as funções:

FazAlgo(object arg) {} //overload 1
FazAlgo(params object[] args) {} //overload 2

Minha chamada é assim:

string[] parametros = {"Giovanni", "Bassi"};
FazAlgo(parametros);

Qual overload é chamado? Revendo as opções:

  1. O primeiro é chamado, passando um array de strings como um objeto.
  2. O segundo é chamado, passando um array de strings como se fosse um array de objetos.
  3. O segundo é chamado, passando um array de strings como um objeto do array args, como se implicitamente fizesse "FazAlgo(new object[] {parametros})"

 

Adianto que a opção 3, apesar de tecnicamente ser possível, não é a correta porque há duas opções mais diretas. Nesta terceira opção o compilador tem que expandir o objeto de object para object[], e, como nas outras duas opção não há mudança alguma, a terceira opção é descartada.

Graças à covariância entre arrays, podemos converter implicitamente de string[] para object[]. Isso coloca o overload 2 como mais específico que o overload 1, e portanto ele é o escolhido. Um array de strings pode até ser um object, mas ele é mais especificamente um array de objetos. O tipo mais específico sempre ganha.

Engraçado que normalmente quando essa questão é levantada a maioria das pessoas dizem que a opção 1 é a correta. Mas não me parece a mais óbvia. Talvez as pessoas não entendam a questão da variância.


Postado na(s) categoria(s) .Net pelo giovanni bassi em 8 de junho de 2009 às 10:50 | Tags:

Comentários


Brazil Read-Only
junho 8. 2009 13:47
Read-Only
Eu já sabia!!! rsss
Parabéns pelo trabalho Giovanni.

no site


junho 9. 2009 08:24
Prodis
Só faltou agradecer às pessoas que comentaram mandando respostas.

Obrigado pela explicação.

http://prodis.pro.br/http://prodis.pro.br/


junho 10. 2009 10:48
Giovanni Bassi
Opa, agradecido já: valeu pessoal!
Na verdade, eu já tinha escrito a resposta junto com a pergunta. Só publiquei depois. ;)

http://unplugged.giggio.net/http://unplugged.giggio.net/

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  setembro 2010  »
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in