Freigeben über


Geek Quizz III: subtilités dans les conversions

Pourquoi donc ce code ne compile-t-il pas ?
L'intérêt est bien évidemment de trouver sans compiler le code, ce qui donnerait immédiatement la solution...
...comme ça, ça fait également un test à la résistance :p.

 public class MyClass
{
    private int[] values = new int[] { 1, 2, 3, 4 };
    public IEnumerable<int> Values
    {
        get { return values; }
    }
    public static implicit operator IEnumerable<int>(MyClass c)
    {
        return c.Values;
    }
}

Question bonus: quel est le problème technique que je tente de résoudre dans cette approche ?

Mitsu

[Update] Quizz suivant: Geek Quizz IV: méthodes identiques ?

Comments

  • Anonymous
    July 27, 2007
    Sans réfléchir, je dirais que ca compile pas à cause d'un problème de conversion à ce niveau ? public static implicit operator IEnumerable<int>(MyClass c)    {        return c.Values;    } Un pb avec la conversion et l'interface ?

  • Anonymous
    July 27, 2007
    Je suis assez d'accord avec Florent, je ne pense pas que la conversion implicite vers une interface soit possible. Deux classes implémentant une même interface peuvent être référencé par l'interface mais il n'est pas pour autant possible de les affecter entre elles.

  • Anonymous
    July 27, 2007
    Effectivement, y'a une histoire de conversion impossible (de mémoire, les conversions définies par l'utilisateur doivent retourner des types concrets, ou du moins des types qui ne sont pas des interfaces...). Après pour l'intéret, je vois bien un truc comme la simulation d'un héritage de int[].

  • Anonymous
    July 27, 2007
    Bravo à vous tous, (Vous remarquerez qu'il n'y a rien a gagner dans ce quizz, sinon toute ma considération :p). En effet, C# ne supporte pas le fait de convertir "de" ou "vers" une interface. C'est principalement un problème d'identité des références (dixit Anders). En effet, les convertions (surtout implicites) donnent l'impression d'"être" un autre type. Aussi pour des raisons d'identité, de lisibilité et également de simplicité du compilateur, ces convertions sont tout simplement interdites par le langage C#. Et la question bonus ? Qu'essayais-je de résoudre dans mon exemple ? Indice spécial pour Florent: c'est une fonctionnalité du langage Delphi qui n'existe pas dans C#... Mitsu

  • Anonymous
    July 29, 2007
    Je crois avoir trouver....une propriété par défaut comme la propriété Strings d'une TStringList ? Alors, j'ai gagné de la considération ou j'en ai perdu ?

  • Anonymous
    July 30, 2007
    Pas tout à fait. Dernier indice avant la réponse, c'est propre à l'implémentation des interfaces..

  • Anonymous
    July 30, 2007
    Vu que mon crédit considération est à 0 je me risque à une autre réponse : délégation d'interface

  • Anonymous
    July 31, 2007
    Tout d'abord, toute mon estime à Tétranos pour sa réponse à la question bonus . En effet, je tentais

  • Anonymous
    July 31, 2007
    Tout d&#39;abord, toute mon estime à Tétranos pour sa réponse à la question bonus . En effet, je tentais

  • Anonymous
    August 16, 2007
    Soit la méthode de ma couche business suivante: IQueryable &lt; Customer &gt; GetCustomers() { return