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 (10)

  1. 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 ?

  2. Tetranos says:

    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.

  3. Simon says:

    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[].

  4. mitsu says:

    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

  5. Tetranos says:

    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 ?

  6. mitsu says:

    Pas tout à fait.

    Dernier indice avant la réponse, c’est propre à l’implémentation des interfaces..

  7. Tetranos says:

    Vu que mon crédit considération est à 0 je me risque à une autre réponse : délégation d’interface

  8. Tout d’abord, toute mon estime à Tétranos pour sa réponse à la question bonus . En effet, je tentais

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

  10. Soit la méthode de ma couche business suivante: IQueryable &lt; Customer &gt; GetCustomers() { return