Conversions étendues et restrictives (Visual Basic)

Une considération importante lors d’une conversion de type est de savoir si le résultat de la conversion se trouve dans la plage du type de données de destination.

Une conversion étendue modifie une valeur en un type de données qui peut autoriser n’importe quelle valeur possible des données d’origine. Les conversions étendues préservent la valeur source, mais peuvent modifier sa représentation. Cela se produit si vous convertissez depuis un type intégral vers Decimal, ou depuis Char vers String.

Une conversion restrictive modifie une valeur en un type de données qui peut ne pas pouvoir contenir certaines des valeurs possibles. Par exemple, une valeur fractionnaire est arrondie lorsqu’elle est convertie en type intégral, et un type numérique en cours de conversion vers Boolean est réduit à True ou False.

conversions étendues

Le tableau suivant montre les conversions d’élargissement standard.

Type de données S’étend aux types de données 1
SByte SByte, Short, Integer, Long, Decimal, Single, Double
Byte Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
short Short, Integer, Long, Decimal, Single, Double
UShort UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
Integer Integer, Long, Decimal, Single, Double2
UInteger UInteger, Long, ULong, Decimal, Single, Double2
Long Long, Decimal, Single, Double2
ULong ULong, Decimal, Single, Double2
Décimal Decimal, Single, Double2
Unique Single, Double
Double Double
Tout type énuméré (Énumération) Son type intégral sous-jacent et tout type auquel le type sous-jacent s’étend.
Char Char, String
Tableau Char Tableau Char, String
Tout type Object
Tout type dérivé Tout type de base dont il est dérivé 3.
Tout type N’importe quelle interface qu’il implémente.
Nothing Tout type de données ou type d’objet.

1 Par définition, chaque type de données s’étend à lui-même.

2 Les conversions de Integer, UInteger, Long, ULong ou Decimal vers Single ou Double peuvent entraîner une perte de précision, mais jamais une perte de magnitude. En ce sens, elles n’entraînent pas de perte d’informations.

3 Il peut sembler surprenant qu’une conversion d’un type dérivé à l’un de ses types de base s’étende. La justification est que le type dérivé contient tous les membres du type de base, donc il est considéré comme un instance du type de base. Dans le sens inverse, le type de base ne contient pas de nouveaux membres définis par le type dérivé.

Les conversions étendues réussissent toujours au moment de l’exécution et n’entraînent jamais de perte de données. Vous pouvez toujours les effectuer implicitement, si l’instruction Option Strict définit le commutateur de vérification de type sur On ou sur Off.

conversions restrictives

Les conversions de rétrécissement standard sont les suivantes :

  • Directions inverses des conversions d’élargissement dans le tableau précédent (sauf que chaque type s’étend à lui-même)

  • Conversions dans les deux sens entre booléen et n’importe quel type numérique

  • Conversions de n’importe quel type numérique vers n’importe quel type énuméré (Enum)

  • Conversions dans les deux sens entre String et n’importe quel type numérique, Boolean, ou Date

  • Conversions d’un type de données ou d’un type d’objet vers un type dérivé de celui-ci

Les conversions restrictives ne réussissent pas toujours au moment de l’exécution et peuvent échouer ou entraîner une perte de données. Une erreur se produit si le type de données de destination ne peut pas recevoir la valeur en cours de conversion. Par exemple, une conversion numérique peut entraîner un dépassement de capacité. Le compilateur ne vous permet pas d’effectuer des conversions restrictives implicitement, sauf si l’instruction Option Strict définit le commutateur de vérification de type sur Off.

Notes

L’erreur de conversion restrictive est supprimée pour les conversions des éléments d’une collection For Each…Next en variable de contrôle de boucle. Pour plus d’informations et d’exemples, consultez la section « Réduction des conversions » dans Pour chaque... Instruction suivante.

Quand utiliser des conversions restrictives

Vous utilisez une conversion restrictive lorsque vous savez que la valeur source peut être convertie en type de données de destination sans erreur ni perte de données. Par exemple, si vous avez un String qui contient « True » ou « False », vous pouvez utiliser le mot clé CBool pour le convertir en Boolean.

Exceptions lors de la conversion

Étant donné que les conversions d’élargissement réussissent toujours, elles ne lèvent pas d’exceptions. Les conversions restrictives, lorsqu’elles échouent, lèvent le plus souvent les exceptions suivantes :

  • InvalidCastException — si aucune conversion n’est définie entre les deux types

  • OverflowException — (types intégraux uniquement) si la valeur convertie est trop grande pour le type cible

Si une classe ou une structure définit une fonction CType pour servir d’opérateur de conversion vers ou à partir de cette classe ou structure, CType peut lever toute exception qu’elle juge appropriée. En outre, CType peut appeler des fonctions Visual Basic ou des méthodes .NET Framework, ce qui à son tour peut lever diverses exceptions.

Modifications lors des conversions de type référence

Une conversion à partir d’un type de référence copie uniquement le pointeur vers la valeur. La valeur elle-même n’est ni copiée ni modifiée d’aucune manière. La seule chose qui peut changer est le type de données de la variable contenant le pointeur. Dans l’exemple suivant, le type de données est converti de la classe dérivée en classe de base, mais l’objet vers lequel les deux variables pointent maintenant est inchangé.

' Assume class cSquare inherits from class cShape.  
Dim shape As cShape  
Dim square As cSquare = New cSquare  
' The following statement performs a widening  
' conversion from a derived class to its base class.  
shape = square  

Voir aussi