Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

Petit quizz sur les génériques

Quel sera le résultat du code suivant :

class Program

{

    static void Main(string[] args)

    {

        B b = new B();

        b.Foo(1);

        Console.ReadLine();

    }

}

 

class A<T>

{

    public void Foo(T t)

    {

        Console.WriteLine("T");

    }

    public void Foo(int i)

    {

        Console.WriteLine("int");

    }

}

class B : A<int>

{

}

 

Surlignez ce qui suit pour voir la réponse

int

 

Si vous aimez ce genre de cas tordus, je vous invite à regarder le blog de Sam Ng et tout particulièrement le post suivant.

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié mardi 4 mars 2008 07:16 par Matthieu MEZIL

Classé sous : , ,

Commentaires

# re: Petit quizz sur les génériques @ mardi 4 mars 2008 09:30

hum... une exception ?

le compilateur doit détecter 2 méthodes avec la même signature... non ?

sebmafate

# re: Petit quizz sur les génériques @ mardi 4 mars 2008 09:46

Je penche pour la même réponse que sebmafate: T étant de type int pour B, on a de fois la méthode Foo avec la même signature.

Thomas LEBRUN

# re: Petit quizz sur les génériques @ mardi 4 mars 2008 09:47

Perdu !

La réponse est écrite en blanc dans le post.

Matthieu MEZIL

# re: Petit quizz sur les génériques @ mardi 4 mars 2008 10:09

Fichtre, je m'effraie...

pas .Nettiens pour deux sous, j'ai trouvé la réponse ^^

il semble le compilo favorise le proto dont le type colle au plus près..., le proto avec le T étant donc une roue de secours.

Renfield

# re: Petit quizz sur les génériques @ mercredi 5 mars 2008 09:13

Roue de secours, n'exagérons rien :). On peut aller plus loin et examiner ce que retourne ceci :

class Program

{

   static void Main(string[] args)

   {

       B b = new B();

       b.FooPub(1);

       Console.ReadLine();

   }

   class A

<T>

   {

       private void Foo(T t)

       {

           Console.WriteLine("T");

       }

       private void Foo(int i)

       {

           Console.WriteLine("int");

       }

       public void FooPub(T t)

       {

           Foo(t);

       }

   }

   class B : A<int>

   {

   }

}

Julien237

# re: Petit quizz sur les génériques @ mercredi 5 mars 2008 09:35

Dans le cas de Julien, le résultat est "bien entendu" T.

Maintenant, un autre cas amusant. Le code suivant génère une erreur à la compilation :

class Program

{

    static void Main(string[] args)

    {

        B b = new B();

        b.Foo(1);

        Console.ReadLine();

    }

}

 

class A<T, K>

{

    public void Foo(T t)

    {

        Console.WriteLine("T");

    }

    public void Foo(K k)

    {

        Console.WriteLine("K");

    }

}

 

class B : A<int, int>

{

}

 

The call is ambiguous between the following methods or properties: 'ConsoleApplication41.A<T,K>.Foo(T)' and 'ConsoleApplication41.A<T,K>.Foo(K)'

 

mais pas le code suivant qui affiche "Int" dans la console:

class Program

{

    static void Main(string[] args)

    {

        B b = new B();

        b.Foo(1);

        Console.ReadLine();

    }

}

 

class A<T, K>

{

    public void Foo(T t)

    {

        Console.WriteLine("T");

    }

    public void Foo(K k)

    {

        Console.WriteLine("K");

    }

    public void Foo(int i)

    {

        Console.WriteLine("Int");

    }

}

 

class B : A<int, int>

{

}

Matthieu MEZIL

# re: Petit quizz sur les génériques @ mercredi 5 mars 2008 10:41

Oui, le but de mon exemple était de montrer qu'il était impossible, (du moins de cette manière, simple et pratique) de faire un traitement particulier pour certains types T.

On pourrait vouloir exécuter une méthode pour tous les T, sauf lorsque T est int alors on exécute une autre méthode...

Julien237

# re: Petit quizz sur les génériques @ mercredi 5 mars 2008 13:06

Oui, julien, effectivement c'est aussi une limitation que je regrette.

L'explication est que lorsque le compilateur compile l'appel a Foo depui FooPub, il ne connait pas le type de la variable t, il lie donc l'appel a la fonction qui marchera dans tous les cas.

RaptorXP

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Microsoft Regional Director 2.0 ! par Le blog de Patrick [MVP Office 365] le 02-23-2015, 22:10

- TechDays Paris 2015: Malware unchained par Blog Technique de Romelard Fabrice le 02-12-2015, 22:58

- TechDays Paris 2015: La transformation du SI avec le Cloud Microsoft, quel sera le rôle de la DSI demain, comment le Cloud MS accompagne cette transfo... par Blog Technique de Romelard Fabrice le 02-12-2015, 22:51

- TechDays Paris 2015: L’intranet social avec Office 365 et Yammer - quelles possibilités d’intégration ? par Blog Technique de Romelard Fabrice le 02-12-2015, 22:46

- TechDays Paris 2015: Plenière jour 3 - Vers une technologie invisible et une intelligence omniprésente ? par Blog Technique de Romelard Fabrice le 02-12-2015, 10:59

- TechDays Paris 2015: Geek is in da {new} House par Blog Technique de Romelard Fabrice le 02-12-2015, 01:13

- TechDays Paris 2015: Windows Server vNext - Virtualisation et Stockage par Blog Technique de Romelard Fabrice le 02-12-2015, 00:26

- TechDays Paris 2015: Quoi de neuf dans Windows 10 ? par Blog Technique de Romelard Fabrice le 02-11-2015, 23:37

- TechDays Paris 2015: Réussir sa migration vers Office 365 en formant les uilisateurs par Blog Technique de Romelard Fabrice le 02-11-2015, 14:32

- TechDays Paris 2015: Windows 10 et PowerShell 5.0 par Blog Technique de Romelard Fabrice le 02-11-2015, 13:10