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 :

Equivalence de type avec nullable


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut Equivalence de type avec nullable
    Bonjour,

    J'ai une erreur de compilation que j'ai du mal à comprendre. Voilà le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ExamDate = inf.ExamDate.ToOADate() == 0.0 ? null : inf.ExamDate;
    ExamDate est du type System.DateTime? et inf.ExamDate de type System.Datetime.

    A la compilation, j'ai l'erreur:

    Erreur 1 Le type d'expression conditionnelle ne peut pas être déterminé, car il n'existe pas de conversion implicite entre '<null>' et 'System.DateTime'
    Si j'écris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (inf.ExamDate.ToOADate() == 0.0)
         ExamDate = null;
    else
         ExamDate = inf.ExamDate;
    Aucune erreur !

    Ça me parait pourtant être la même chose.
    Pourtant, il y a forcément une différence sinon C# ne râlerait pas.


    Par contre, si je fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ExamDate = inf.ExamDate.ToOADate() == 0.0 ? null : (System.DateTime?)inf.ExamDate;
    Plus d'erreur non plus !

    Ce qui voudrait dire que je ne peux assigner à mon ExamDate qu'une valeur de type System.DateTime? Pourtant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExamDate = inf.ExamDate;
    compile sans problème !

    J'ai beau ouvrir les yeux et me gratter la tète, je ne comprends pas !

    Papy !

  2. #2
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par défaut
    Le problème vient de l'opérateur ternaire ?

    Dans le premier cas, il rencontre un DateTime, type valeur, et un null, qui ne peut être assigné qu'à un type référence.

    null ne pouvant être utilisé pour déterminer le type de retour de l'expression conditionnelle, le compilateur utilise le type du troisième terme (DateTime). Il se rend alors compte que le deuxième terme (null) n'est pas assignable à DateTime => erreur.

    Si tu castes le troisième terme en en DateTime?, le compilateur, selon le même schéma, détermine que le type de retour est DateTime?, auquel il peut assigner le résultat du deuxième terme (null), et donc tout va bien.

    L'opérateur ternaire ? n'est pas exactement un raccourci pour une structure if...else. Il y a des contraintes supplémentaires, du fait que ? renvoie une valeur de retour, ce que ne fait pas if.

  3. #3
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Un truc comme ça :
    ne peut fonctionner que si a est convertible dans le type de b ou inversement.

    Ici, tu as null, qui est un object, et un DateTime. Le compilo ne va pas parcourir l'ensemble des types dans lesquels a et b peuvent être implicitement convertis...

    Donc, soit tu remplaces par un if... else, soit tu castes l'un ou l'autre en DateTime?, ou alors tu remplaces null par default(DateTime?), qui vaut bien null, mais un null typé

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Ok, j'ai compris, merci :-)

    ps: default(DateTime?) , ça, je ne connaissais pas encore. J'en apprends tous les jours et j'aime ça

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    default(...) est surtout utile avec les generics.

    Par exemple, List<T>.Find(Predicate<T>) renvoie le premier objet de la liste qui satisfait le prédicat donné. Mais s'il n'y en pas pas, il renvoie default(T), qui est null pour les class, et 0 pour les int, 0.0d pour les double, le 1janv01 pour les Dates, et "null" pour les nullable (qui sont des structs, d'ailleurs).

    Donc si tu veux faire une méthode générique, sans contrainte du style "where T : class", et que tu veux ernvoyer une valeur par défaut, "return null" est incorrect, parce que null n'existe pas pour tous lestypes (uniquement pour les classes et les nullable). Il faut alors écrire "return default(T)".

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

Discussions similaires

  1. Pb de type avec Mingw
    Par titus55 dans le forum C++
    Réponses: 4
    Dernier message: 06/10/2005, 12h59
  2. Equivalant du type Datetime sous postgress
    Par jiefm dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 01/04/2005, 09h35
  3. [Recordset] Incompatibilté de type avec une requête
    Par lbourlet dans le forum Access
    Réponses: 2
    Dernier message: 29/10/2004, 15h52
  4. [DB2 V7 & V8] equivalent du type SERIAL
    Par geoffrey_k dans le forum DB2
    Réponses: 3
    Dernier message: 05/07/2004, 14h09
  5. Equivalent IN ms avec un ET au lieu du OU ds la lste
    Par Pompil dans le forum Requêtes
    Réponses: 4
    Dernier message: 04/03/2004, 21h20

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