none
question VB.Net opérateur ternaire iif RRS feed

  • Question

  • Bonjour
    je développe une application en VB .Net et je ne comprends pas pourquoi le code suivant, qui utilise un conteneur générique Dictionary:

    dim dict as new Dictionary(Of String,String)
    dim keys as string() = new string(){"lundi","mardi","mercredi","jeudi","vendredi"}

    for each key as string in keys
         dict.add(key,"item")
    next

    dim data as string=Iif(dict.ContainsKey("Lundi"),dict("Lundi"),"inconnu")

    me lève une exception de type KeynotFoundException, alors  qu'en remplaçant le Iif par le code suivant:

    dim data as string
    if dict.ContainsKey("Lundi") then
        data=dict("Lundi")
    else
        data="inconnu"
    end if

    je n'ai plus d'exception. Normalement, je ne devrais pas avoir d'exception dans les deux cas.

    J'utilise l'environnement Visual studio 2005 et le compilateur

    Microsoft Visual Basic 2005   77921-113-3000004-41018

    sur un PC tournant sur Windows XP avec le framework.Net 2.0.50727 SP1.

    D'avance merci pour votre aide.

     


    lundi 6 avril 2009 10:01

Réponses

  • Bonjour

    L'instruction IIF évalue systématiquement ses 3 paramètres.

    Comme dict("Lundi") n'est pas valide (puisque en réalité c'est "lundi" (minuscule) qui existe), il y a alors exception.
    If faut donc utiliser IF au lieu de IIF.
    Exemple : dim data as string=IF(dict.ContainsKey("Lundi"),dict("Lundi"),"inconnu")

    IF( arg1, arg2, arg3) existe en VB 2008. Je dois avouer que je ne sais pas si c'est supporté dans VB 2005.

    En espérant vous avoir aidé
    Thierry
    mercredi 8 avril 2009 15:50
  • Bonjour,
    Au passage, il y a le même problème avec AND et OR qui contrairement aux autres langages testent toutes les opérandes ! (par compatibilité ascendante avec VB 6). Du coup, il faut quasiment les proscrire et préférer ANDALSO et ORELSE qui eux fonctionnent plus logiquement:
    - si la 1ère opérande est fausse ANDALSO ne teste pas la seconde
    - si la 1ère opérande est vraie, ORELSE ne teste pas la seconde

    Xavier
    Xavier
    lundi 20 avril 2009 11:14

Toutes les réponses

  • Bonjour

    L'instruction IIF évalue systématiquement ses 3 paramètres.

    Comme dict("Lundi") n'est pas valide (puisque en réalité c'est "lundi" (minuscule) qui existe), il y a alors exception.
    If faut donc utiliser IF au lieu de IIF.
    Exemple : dim data as string=IF(dict.ContainsKey("Lundi"),dict("Lundi"),"inconnu")

    IF( arg1, arg2, arg3) existe en VB 2008. Je dois avouer que je ne sais pas si c'est supporté dans VB 2005.

    En espérant vous avoir aidé
    Thierry
    mercredi 8 avril 2009 15:50
  • Bonjour,
    Au passage, il y a le même problème avec AND et OR qui contrairement aux autres langages testent toutes les opérandes ! (par compatibilité ascendante avec VB 6). Du coup, il faut quasiment les proscrire et préférer ANDALSO et ORELSE qui eux fonctionnent plus logiquement:
    - si la 1ère opérande est fausse ANDALSO ne teste pas la seconde
    - si la 1ère opérande est vraie, ORELSE ne teste pas la seconde

    Xavier
    Xavier
    lundi 20 avril 2009 11:14