Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Matthieu MEZIL

I love .Net

Abonnements

Extension method et surcharge

Le billet de frédéric a donné lieu a une série de commentaires très intéressants et notamment à la question suivante : comment le compilateur choisit-il une extension method.

Après quelques tests, je pense que la réponse est la suivante :

Le compilateur cherche la méthode la plus typée dans le namespace d'appel de l'extension method. Si et seulement s'il n'en trouve pas, il cherche dans les namespaces qu'il a en using.

De ce fait, imaginons le cas suivant :

Dans une assembly 1, le code suivant :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using ClassLibrary1;

namespace ConsoleApplication3
{
  class Program
  {
    static void Main(string[] args)
    {
      C3 s = new C3();
      Console.WriteLine(s.Test());
      Console.ReadLine();
    }
  }
  public static class Class1
  {
    public static string Test(this C1 o)
    {
      return "C1";
    }
  }
}

et dans une assembly 2 le code suivant :

namespace ClassLibrary1
{
  public class C1
  {
  }
  public class C2 : C1
  {
  }
  public class C3 : C2
  {
  }

  public static class Class1
  {
    public static string Test(this C3 t)
    {
      return "C3";
    }
  }
}
namespace ConsoleApplication3
{
  public static class Class1
  {
    public static string Test(this C2 o)
    {
      return "C2";
    }
  }
}

La console affichera : C2.

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 27 novembre 2007 13:12 par Matthieu MEZIL

Classé sous : , ,

Commentaires

# re: Extension method et surcharge @ mardi 27 novembre 2007 19:15

C'est en effet un mécanisme au coeur de LINQ puisque c'est grâce à ça que la méthode d'extension Select(IQueryable) par exemple est choisie pour LINQ to SQL alors que Select(IEnumerable) aurait aussi été possible.

En fait, la résolution est fait comme en cas de shadowing (pour des instance method). C'est le type connu lors de la compilation qui est utilisé, pas le type réel de l'instance.

RaptorXP

# re: Extension method et surcharge @ mardi 27 novembre 2007 23:32

Merci à tous les deux pour avoir éclairer la discution. Je me suis aperçu que ma surcharge du select pour l'usage de Linq to SQL ne fonctionnait pas dans tous les cas :

http://blogs.codes-sources.com/tkfe/archive/2007/11/25/c-3-0-surcharger-une-m-thode-d-extension-suite.aspx#35913

tkfe

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- TechDays Paris 2010 : Déploiement de nouvelles technologies – Retour d’expérience par l’informatique de Microsoft par Blog Technique de Romelard Fabrice le il y a 36 minutes

- TechDays Paris 2010 : Plan de migration vers SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 4 heures et 18 minutes

- TechDays Paris 2010 : La pleinière du second jour par Blog Technique de Romelard Fabrice le il y a 5 heures et 23 minutes

- Visual Studio 2010 and .NET Framework 4 Release Candidate now available par Matthieu MEZIL le il y a 8 heures et 29 minutes

- Création d’une base de donnée sous SQL Azure par Le Blog (Vert) d'Arnaud JUND le il y a 9 heures et 26 minutes

- TechDays Paris 2010 : Les Services d’applications dans SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 19 heures et 25 minutes

- TechDays Paris 2010 : La GED et SharePoint 2010 par Blog Technique de Romelard Fabrice le il y a 23 heures et 23 minutes

- TechDays Paris 2010 : SharePoint 2010 et Les réseaux sociaux par Blog Technique de Romelard Fabrice le 02-08-2010, 15:40

- TechDays Paris 2010 : SharePoint 2010 – Description et nouveautés par Blog Technique de Romelard Fabrice le 02-08-2010, 14:33

- TechDays Paris 2010 : Pleinière Lundi par Blog Technique de Romelard Fabrice le 02-08-2010, 14:30