A quoi peut bien servir une lambda x=>x ?

A quoi peut bien servir le genre de code ci-dessous ?

ConvertAll<A>(x => x)

A priori, faire une expression lambda de type “identité”, ça parait un peu capillotracté. La première idée qui vient est que ça pourrait servir pour gérer les transformations dans la hiérarchie d’héritage des classes. Par exemple :

class A
{ }

class B : A
{ }

class Program
{
    static void Main(string[] args)
    {
        List<B> liste = new List<B>();
        IEnumerable<A> resultat = liste.ConvertAll<A>(x => x);
    }
}

Mais dans ce genre de situation, il n’y a pas besoin de convertir. La covariance de IEnumerable fait que ça fonctionne correctement si on écrit simplement ceci :

static void Main(string[] args)
{
    List<B> liste = new List<B>();
    IEnumerable<A> resultat = liste;
}

Un cas qui peut expliquer ce recours à une lambda de type “x => x” est lorsque ce n’est pas une relation d’héritage, mais de conversion entre les différents types, qui existe. A l’inverse de la covariance ci-dessus, le code ci-dessous ne compile pas :

class A
{
    public static implicit operator A(B objet)
    {
        return new A();
    }
}

class B
{ }

class Program
{
    static void Main(string[] args)
    {
        List<B> liste = new List<B>();
        IEnumerable<A> resultat = liste;
    }

}

Pour que la compilation passe, il faut écrire :

static void Main(string[] args)
{
    List<B> liste = new List<B>();
    IEnumerable<A> resultat = liste.ConvertAll<A>(x => x);
}

Ou, pour aider les performances :

static void Main(string[] args)
{
    List<B> liste = new List<B>();
    IEnumerable<A> resultat = liste.Select<B, A>(x => x);
}

 

Il est à noter que seule la covariance rend nécessaire cette écriture. Une boucle foreach n’aurait pas posé de problème, car c’est une véritable conversion qui se passe. Ainsi, si on écrit le code ci-dessous, il n’y aura pas de problème de compilation, ni dans un cas ni dans l’autre :

foreach (A instance in liste)

Ce petit quizz a rapporté un paquet de gâteaux à Stéphane B. Félicitations ! Sourire

About JP Gouigoux

Jean-Philippe Gouigoux est Architecte Logiciel, MVP Connected Systems Developer. Il intervient régulièrement à l'Université de Bretagne Sud ainsi qu'à l'Agile Tour. Plus de détails sur la page "Curriculum Vitae" de ce blog.
This entry was posted in C# and tagged . Bookmark the permalink.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha Captcha Reload