Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Une considération importante avec 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 type de données qui peut permettre toute valeur possible des données d’origine. Les conversions étendues conservent la valeur source, mais peuvent modifier sa représentation. Cela se produit si vous convertissez d’un type intégral en Decimal
, ou de Char
vers String
.
Une conversion restrictive modifie une valeur en type de données qui peut ne pas être en mesure de 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 présente les conversions d'élargissement typique.
Type de données | Élargit aux types de données 1 |
---|---|
SByte |
SByte , Short , , Long Integer , Decimal , , Single ,Double |
d’octets |
Byte , , Short , Integer UShort , , Long Single ULong Decimal UInteger Double |
Court |
Short , , Integer , Decimal Long , , Single Double |
UShort |
UShort , Integer , , Long UInteger , ULong , Decimal , , Single ,Double |
Entier |
Integer , Long , Decimal , Single , , 2Double |
UInteger |
UInteger , Long , , Decimal ULong , Single , , 2Double |
Long |
Long , Decimal , , Double Single 2 |
ULong |
ULong , Decimal , , Double Single 2 |
Décimal |
Decimal , , Single Double 2 |
Unique |
Single , Double |
Double | Double |
Tout type énuméré (Enum) | Son type intégral sous-jacent et tout type vers lequel le type sous-jacent s'élargit. |
Caractère |
Char , String |
Char tableau |
Char tableau, String |
Tout type | Objet |
Tout type dérivé | Tout type de base à partir duquel il est dérivé 3. |
Tout type | Toute interface qu’il implémente. |
Rien | Tout type de données ou type d’objet. |
1 Par définition, chaque type de données s’élargit à lui-même.
2 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 grandeur. Dans ce sens, ils n’entraînent pas de perte d’informations.
3 Il peut sembler surprenant qu'une conversion d'un type dérivé vers l'un de ses types de base soit élargie. La justification est que le type dérivé contient tous les membres du type de base, de sorte qu’il se qualifie comme une instance du type de base. Dans la direction opposée, le type de base ne contient aucun nouveau membre défini par le type dérivé.
Les conversions élargissantes réussissent toujours lors de l'exécution et n'entraînent jamais de perte de données. Vous pouvez toujours les effectuer implicitement, que l’instruction Option Strict définisse le commutateur de vérification de type sur On
ou sur Off
.
conversions restrictives
Les conversions rétrécissantes standard sont les suivantes :
Les directions inverses des conversions élargissantes du tableau précédent (sauf que chaque type s'élargit vers 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 en n’importe quel type énuméré (
Enum
)Conversions dans les deux sens entre Chaîne 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 convertie. Par exemple, une conversion numérique peut entraîner un dépassement de capacité. Le compilateur ne vous permet pas d’effectuer implicitement des conversions de réduction, sauf si l’instruction Option Strict définit le commutateur de vérification de type sur Off
.
Remarque
L'erreur de conversion de réduction est supprimée pour les conversions des éléments d'une collection For Each…Next
vers la variable de contrôle de boucle. Pour plus d'informations et d'exemples, consultez la section « Conversions de réduction » dans Instruction For Each...Next.
Quand utiliser les conversions de réduction
Vous utilisez une conversion restrictive lorsque vous connaissez 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 une String
dont vous savez qu'elle contient « Vrai » ou « Faux », vous pouvez utiliser le mot-clé CBool
pour la convertir en Boolean
.
Exceptions pendant la conversion
Comme les conversions d'élargissement aboutissent toujours, elles ne génèrent pas d'exceptions. Lorsqu'elles échouent, les conversions de réduction génèrent 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, elle CType
peut lever n’importe quelle exception qu’elle juge appropriée. En outre, cela CType
peut appeler des fonctions Visual Basic ou des méthodes .NET Framework, qui à leur tour peuvent lever diverses exceptions.
Modifications pendant les conversions de types de référence
Une conversion à partir d’un type référence copie uniquement le pointeur vers la valeur. La valeur elle-même n’est ni copiée ni modifiée de quelque manière que ce soit. 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