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#... MitsuAnonymous
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'interfaceAnonymous
July 31, 2007
Tout d'abord, toute mon estime à Tétranos pour sa réponse à la question bonus . En effet, je tentaisAnonymous
July 31, 2007
Tout d'abord, toute mon estime à Tétranos pour sa réponse à la question bonus . En effet, je tentaisAnonymous
August 16, 2007
Soit la méthode de ma couche business suivante: IQueryable < Customer > GetCustomers() { return