IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Cast et Array


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Par défaut Cast et Array
    Bonjour,
    un truc que je ne pige pas! Pourquoi ne peut-on pas caster un tableau d'objet.

    Par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    static void Main( string[] args )
    {
                ArrayList oList = new ArrayList();
     
                for (int i = 0; i < 100; i++)
                    oList.Add( i );
     
                int[] o = (int[])oList.ToArray();
    ....
    }
    ne compile pas car "Impossible de convertir le type 'object[]' en 'int[]'

    de même un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int[] o = oList.ToArray() as int[]
    ne compile pas

    En fait j'ai remarqué ce comportement en codant une méthode générique
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new List<T>( p_oList.ToArray() as T[] );
    compile mais renvoi une exception car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     p_oList.ToArray() as T[]
    renvoi null

    J'aimerai bien comprendre le pourquoi de tout ça...
    Merci de vos éclaircissements

  2. #2
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    C'est assez simple. int est un type. int[] est un autre type. Bien qu'un tant qu'humain on voit la relation que l'un est un tableau de l'autre, ce sont deux types différents.

    Par contre, si tu veux facilement convertir un tableau d'un type vers un tableau d'un autre type tu peux utiliser Array.ConvertAll comme décrit ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    /*
    public static TOutput[] ConvertAll<TInput,TOutput> (
    	TInput[] array,
    	Converter<TInput,TOutput> converter
    )
     
    */
    public static void Main()
        {
            PointF[] apf = {
                new PointF(27.8F, 32.62F),
                new PointF(99.3F, 147.273F),
                new PointF(7.5F, 1412.2F) };
     
            Console.WriteLine();
            foreach( PointF p in apf )
            {
                Console.WriteLine(p);
            }
     
            Point[] ap = Array.ConvertAll(apf, 
                new Converter<PointF, Point>(PointFToPoint));
     
            Console.WriteLine();
            foreach( Point p in ap )
            {
                Console.WriteLine(p);
            }
        }
    De cette façon, le framework va construire un nouvel Array en castant chaque élément, un par un.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Par défaut
    Oui suis bien d'accord que int et int[] sont deux types distincts. Je suis cependant étonné que l'on puisse effectuer un cast de object vers int
    et que l'on ne puisse pas entre object[] et int[].

    Pour l'exemple que tu mentionnes la conversion est différente, puisqu'il s'agit de 2 structures et que donc le cast entre les 2 n'est pas possible.

    En effet le code suivant ne compile pas :

    object oPoint = new PointF( 27.8F, 32.62F );
    Point jPoint = (Point)oPoint;

  4. #4
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Citation Envoyé par karlus Voir le message
    object oPoint = new PointF( 27.8F, 32.62F );
    Point jPoint = (Point)oPoint;
    Si, ca doit compiler, par contre, au runtime tu auras une exception.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Par défaut
    Suis d'accord ça va compiler et planter à l'exécution. Mais je saisi pas pourquoi le comportement n'est pas le même entre 2 types tableaux.

  6. #6
    Membre émérite Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Par défaut
    Pour ton exemple, je ferais ceci.

    Après, si utilises régulièrement ce type de conversion, libre à toi de créer un type myobject[] et d'y implémenter l'opérateur de cast vers int[].

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ArrayList list = new ArrayList();
     
                for (int i = 0; i < 100; i++)
                {
                    list.Add(i);
                }
     
                int[] intlist = Array.ConvertAll<object, int>(list.ToArray(), delegate(object o) { return (int) o; });
    Le problème aussi c'est d'utiliser ArrayList, tu n'est pas à l'abris d'un type qui ne peut pas etre convertit en int et la c'est l'exception.

    A ta place, j'utiliserais des lists typés en bénéficiant pleinement des generics.

Discussions similaires

  1. [JSON] Problème de Cast Array en String
    Par helter_skelter dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 21/10/2009, 12h02
  2. TStringList en array of string
    Par JediKerian dans le forum Langage
    Réponses: 2
    Dernier message: 20/03/2003, 15h37
  3. Réponses: 2
    Dernier message: 23/02/2003, 00h49
  4. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49
  5. passage en paramètre d'un array dynamique 2D
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 27/11/2002, 19h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo