Invalid cast exception !?

Résolu
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 - 27 oct. 2007 à 23:09
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 - 1 nov. 2007 à 16:07
Bonjour,

J'ai un petit souci que je n'arrive pas a regler en net 1.1 !
J'ai une class Hand dans lequel on retrouve un arraylist m_cards que je remplis avec des enumerations.

je boucle via un for sur la longueur de mon arrayList.count et j'essayes de caster mon type hand en autre objet card comme ceci

Card aCard;

for ()
{
//Invalid cast exception !?
aCard = (Card)m_Cards[i];
//autre traitement
}

Bon ca plante sur la converstion en me disant invalid cast exception !?
Ouais ca ne me dit pas grand chose hormis qu'il y'a un probleme de casting pourtant ce n'est pas la premiere fois que je fais du casting et je n'ai jamais rencontre de probleme !
Auriez vous une idée de ce que je dois checker ou ma facon de caster est mauvaise ?

Merci pour vos infos et bon week end
Christophe

4 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
28 oct. 2007 à 10:00
Tu aurais dû nous donner le message d'erreur, qui doit clairement te dire que la conversion de Card[] en Card ne peut être effectué.

public Hand(Card[] cards)
{
m_Cards.Add(cards);
}
Je suppose que tu voulais plutôt utiliser la méthode AddRange ici.

Sinon tu aurais probablement intérêt à développer une classe de collection fortement typée, ça rendrais le code un peu plus propre et maintenable, à défaut d'être en .NET 2.0 et de pouvoir utiliser les generics.

/*
coq
MVP Visual C#
CoqBlog
*/
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
27 oct. 2007 à 23:17
Salut,

"un arraylist m_cards que je remplis avec des enumerations."
C'est à dire ?

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 1
28 oct. 2007 à 09:48
salut salut coq,

alors voila j'ai une classe Card qui contient quelques properties et des enumerations que voici :

using System;

namespace DeckOfCards
{
//Enum
public enum Suit
{
Hearts,
Diamonds,
Spades,
Clubs
}


public enum FaceValue
{
Ace, Two, Three, Four, Five, Six, Seven,
Eight, Nine, Ten, Jack, Queen, King
}


/// <summary>
/// Description résumée de Card.
/// </summary>
public class Card
{
public Card()
{

}

/// <summary>
///
/// </summary>
///


///


public Card(Suit newSuit, FaceValue newValue)
{

m_Suit= newSuit;
m_FaceValue = newValue;
}



private Suit m_Suit;
public Suit Suit
{
get{ return m_Suit; }
set { m_Suit = value; }
}



private FaceValue m_FaceValue;
public FaceValue FaceValue
{
get{ return m_FaceValue; }
set{ m_FaceValue = value; }
}
}
}

et une autre classe Hands auquel j'instancie mon objet card pour faire quelques tests sur le code que j'ai deja fait :-) !
J'instancie donc deux objets card avec des constructeurs differents.
J'ajoute les cartes a l'array list et ensuite j'essayes de faire une methode contains qui verifie si cette carte existe ou pas !
Et dans cette methode j'ai une boucle for sur l'array list

for( int i = 0; i< m_Cards.Count; i++ )
{
//plante sur cette ligne
aCard = (Card)m_Cards[i];

je transforme mon objet en objet card et c'est la que j'obtiens ce message d'erreur invalid cast execption !
Si tu as une idée merci pour tout !


using System;
using System.Collections;

namespace DeckOfCards
{

/// <summary>
/// Description résumée de Hand.
/// </summary>
public class Hand
{
private ArrayList m_Cards = new ArrayList();


//Test
public static void Main()
{
Card queenOfHeards = new Card(Suit.Hearts, FaceValue.Queen);
Card twoOfClub = new Card(Suit.Clubs, FaceValue.Two);

//Test addcard
Hand aHand = new Hand( new Card[] { queenOfHeards, twoOfClub} );

//Test contains card
Console.WriteLine("Hands contains queenOfHeards {0}",aHand.Contains(queenOfHeards));

//Test contains
Console.WriteLine("Hands contains queen of heards {0}", aHand.Contains(Suit.Hearts, FaceValue.Queen));


}
public Hand()
{
// TODO : ajoutez ici la logique du constructeur
}


public Hand(Card[] cards)
{
m_Cards.Add(cards);
}

/// <summary>
///
/// </summary>
/// Object


public void Add(Card newCard)
{
m_Cards.Add( newCard );
}


public bool Contains(Card carToFind)
{
return m_Cards.Contains(carToFind);
}

/******************* PLANTE SUR CETTE METHODE ***************************/
/// <summary>
///
/// </summary>
///


///


/// <returns></returns>
public bool Contains(Suit suitToFind, FaceValue valueToFind)
{
bool found= false;
Card aCard;

for( int i = 0; i< m_Cards.Count; i++ )
{
//plante sur cette ligne

aCard = (Card)m_Cards[i];
if(( aCard.Suit suitToFind ) && ( aCard.FaceValue valueToFind ))
{
found = true;
}
}
return found;
}

public Card this[int indexer]
{
get{ return (Card)m_Cards[indexer]; }

}
}
}

Merci pour tes idées
Christophe
0
cs_jimmy69 Messages postés 778 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 27 novembre 2008 1
1 nov. 2007 à 16:07
salut coq,

merci c'etait exactement cela !
Je te remercie pour tes infos mais pour le moment j'essayes de bien saisir et comprendre la poo car des exercices que j'essayes de faire !

Merci pour tout et bon week end
Christophe
0
Rejoignez-nous