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 spécifié invalide C#


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Points : 54
    Points
    54
    Par défaut Cast spécifié invalide C#
    Bonjour,

    J'ai une classe vector générique, j'ai écris une fonction retournant la norme du vector courant, voici le code :

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    /// <summary>
    /// Computes the Euclidien norm of the vector
    /// </summary>
    /// <param name="dimension"> the dimension of the vector (unused in this function) </param>
    /// <returns> returns the norm of the vector </returns>
     
    public TField Norm(int dimension)
            {
                var type = typeof(TField);
     
                if (type == typeof(double))
                {
                    double sum_square = 0.0;
     
                    foreach (TField val in this.vectorObject)
                    {
                        var double_value = (double)(object)val;
                        sum_square += (double_value * double_value);
                    }
     
                    return (TField)(object)(Math.Sqrt(sum_square));
                }
                else if (type == typeof(float))
                {
                    float sum_square = 0.0f;
     
                    foreach (TField val in this.vectorObject)
                    {
                        var float_value = (float)(object)val;
                        sum_square += (float_value * float_value);
                    }
                    double len = Math.Sqrt((double)sum_square);
                    return (TField)(object)(len);
                }
                else
                {
                    throw new InvalidOperationException(/*string.Format(InterfaceGraphique.Properties.Resources.MessageGenericArithmeticNotDefined, type.Name)*/);
                }
            }

    tout fonctionne quand j'alloue un vector de double, mais quand j'alloue un vector de float et que je lui demande de me retourner sa norme, il me dit qu'il y a un cast invalide à la ligne return (TField)(object)(len); (dans la condition if (type == typeof (float)))

    je ne comprends pas pourquoi un float ne peut pas être convertit en object?

    Merci

    Algernon

  2. #2
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonjour, le problème vient de la dernière conversion, celle de len, qui est un double même quand TField vaut "float". Du coup tu tentes de faire le cast invalide suivant : double -> object -> float.
    En revanche tu peux tout à fait faire "float -> objet -> float", "float -> double", etc. Mais lors de l'unboxing le type spécifié doit être compatible avec le type naturel, on ne peut pas implicitement faire de conversion.

    PS : C'est une utilisation assez laide des génériques. Il aurait mieux faire des classes non-génériques (FloatVector, DoubleVector) implémentant une interface générique ou héritant d'une classe générique abstraite. Voire utiliser du code dynamique.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 107
    Points : 54
    Points
    54
    Par défaut
    Merci ça fonctionne maintenant .

    Oui en effet, je vais faire une interface générique ça sera mieux que ce type génrique. Mais le code dynamique je ne connais pas ???

    Merci

    Algernon

  4. #4
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Pour le code dynamique c'est une nouveauté de C# 4.0 (2010), voici un exemple de code reprenant ton problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static T Norm<T>(T[] components)
    {
       dynamic sum = default(T);
       foreach(dynamic x in components)
       {
          sum += x * x;
       }
       return (T)(dynamic)Math.Sqrt((double)sum);
    }
    En fait tout est évalué à l'exécution. Ici, au moment de la multiplication, la réflection va être utilisée pour déterminer quelles fonctions correspondent aux opérateurs arithmétiques pour les types de T. Un lambda va alors être compilé à la volée, stocké dans un dictionnaire membre du type, avec en clé les types concernés. Évidemment les performances ne sont pas du tout les mêmes mais si les perfs ne sont pas un souci alors...

    PS : J'ai un doute sur la dernière ligne. Au pire il faudra faire une variable intermédiaire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cast spécifié non valide
    Par r0seBa dans le forum Accès aux données
    Réponses: 15
    Dernier message: 21/12/2009, 21h28
  2. Le cast spécifié n'est pas valide
    Par abbd dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/05/2008, 20h30
  3. Erreur "Le cast spécifié n'est pas valide"
    Par GriffinK dans le forum VB.NET
    Réponses: 4
    Dernier message: 28/04/2008, 10h46
  4. Le cast spécifié n'est pas valide
    Par illegalsene dans le forum VB.NET
    Réponses: 3
    Dernier message: 11/03/2008, 14h59
  5. Problème : cast spécifié n'est pas valide.
    Par paradeofphp dans le forum ASP.NET
    Réponses: 13
    Dernier message: 30/08/2007, 18h10

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