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 , Double 2 |
UInteger | UInteger , Long , ULong , Decimal , Single , Double 2 |
Long | Long , Decimal , Single , Double 2 |
ULong | ULong , Decimal , Single , Double 2 |
Décimal | Decimal , Single , Double 2 |
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 DateConversions 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