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 :

problème avec l'opérateur ternaire "? :"


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut problème avec l'opérateur ternaire "? :"
    Bonjour,
    Je ne comprends pas pourquoi cela ne fonctionne pas. Ça me donne l'erreur "Type of conditional expression cannot be determined because there is no implicit conversion between 'bool' and '<null>'". J'utilise bien un booléen nullable pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool? b;
    string s = "";
    b = (s == "yes" ? true : (s == "no" ? false : null));
    alors que ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool? b;
    string s = "";
    if (s == "yes")
              b = true;
    else if (s == "no")
              b = false;
    else
              b = null;
    Y a-t-il une manière plus concise qu'avec mes if/else if/else pour parvenir à mon résulat?
    Merci pour vos retours,
    Julien

  2. #2
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    Citation Envoyé par jmclej Voir le message
    Y a-t-il une manière plus concise qu'avec mes if/else if/else pour parvenir à mon résulat?
    L'opérateur "?:" est vraiment utilise pour faire un "si" - "sinon".
    Je pense que c'est une mauvaise idée pour la compréhension de vouloir mettre deux conditions dans cet opérateur.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    @katkiller La msdn dit bien que c'est possible (tiré de ton lien)
    L'opérateur conditionnel est associatif sur sa droite. L'expression a ? b : c ? d : e est évaluée comme a ? b : (c ? d : e), et non pas sous la forme (a ? b : c) ? d : e.
    Je penses que le problème vient surtout du faite que tu travails sur un nullable.

    tu dois renvoyer un même type.
    Soit le type de first_expression et second_expression doivent être identiques, soit une conversion implicite doit exister d'un type à un autre.

  4. #4
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Tu peux limiter tes conditionnelles si tu donnes d'avance la valeur null (valeur "par défaut").
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bool? b = null;
    if (s == "yes")
        b = true;
    else if (s == "no")
        b = false;
    Ainsi si s n'est ni yes ni no ; b conserve donc sa valeur de null.

    Quant au problème initial, c'est car il n'existe pas de "type commun" entre false et null (qui n'a en soi pas de type) ; tu peux le résoudre en utilisant un cas ou en recourant à default :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    b = s == "yes" ? true : s == "no" ? false : (bool?)null;
    b = s == "yes" ? true : s == "no" ? false : default(bool?);
    À voir si c'est "mieux" ; la concision ce n'est pas tout ; la lisibilité (et par extension la maintenabilité) c'est souvent plus important

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Merci,
    @katkiller : Par rapport à la clarté, quand on a une petite condition imbriquée dans l'autre, je trouve ça plus claire justement de passer par une ligne avec un opérateur ternaire que par 6 lignes de if. Surtout que je dois répéter ce schéma beaucoup de fois d'affilées dans mon cas.

    @chaparo : le truc c'est que le propre d'un booléen nullable c'est que ça peut justement avoir "2 types" : booléen et null.
    Y a-t-il moyen dans mon cas de créer une conversion implicite pour que ça passe ?

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Merci @Sehnsucht, ça fonctionne comme ça effectivement.

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

Discussions similaires

  1. else if avec l'opérateur ternaire
    Par punky_brooster dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2006, 21h16
  2. [VB6] Problème avec l'opérateur LIKE en SQL
    Par MGD_Software dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/07/2006, 14h56
  3. Réponses: 12
    Dernier message: 11/04/2006, 11h41
  4. Problème avec les opérateurs
    Par jules_lenoir dans le forum Langage
    Réponses: 4
    Dernier message: 26/01/2006, 16h56
  5. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59

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