Conversion explicite
Mise à jour : novembre 2007
La conversion explicite est un mode de conversion propre au langage. Certains compilateurs exigent une conversion explicite pour prendre en charge les conversions restrictives.
Bien que la plupart des langages ayant pour cible le Common Language Runtime prennent en charge la conversion explicite, le mécanisme exact diffère d'un langage à l'autre. Certains langages qui ciblent le Common Language Runtime peuvent exiger qu'une conversion spécifique soit effectuée de façon explicite, tandis que d'autres acceptent une exécution implicite de la même conversion. De la même façon, certains langages exigent qu'une conversion spécifique soit effectuée de manière explicite dans certaines conditions (par exemple, si Option Strict est activé en Visual Basic) mais appliquent la conversion de manière implicite dans d'autres conditions (par exemple, si Option Strict est désactivé en Visual Basic). Consultez la documentation du langage que vous utilisez pour en savoir plus sur les conversions explicites.
Dans certains langages tels que C# et C++, la conversion explicite s'effectue par cast. Le casting se produit lorsque vous préfixez une conversion avec un type de données qui définit le type de conversion que vous voulez effectuer. Dans d'autres langages tels que Visual Basic, la conversion explicite s'effectue via l'appel à une fonction de conversion. En Visual Basic, la fonction CType ou l'une des fonctions de conversion de type spécifiques telles que CStr ou CInt est utilisée pour permettre les conversions explicites de types de données qui ne sont pas permises de façon implicite.
La plupart des compilateurs autorisent les conversions explicites contrôlées ou non contrôlées. Lorsqu'une conversion contrôlée est effectuée, une exception OverflowException est levée si la valeur du type converti se situe hors de la plage du type cible. Lorsqu'une conversion non contrôlée est effectuée dans les mêmes circonstances, la valeur convertie n'entraîne pas nécessairement la levée d'une exception, mais le comportement exact devient indéfini et la valeur obtenue peut être incorrecte.
Remarque : |
---|
En C#, vous pouvez effectuer des conversions contrôlées à l'aide du mot clé checked et de l'opérateur de cast ou en spécifiant l'option de compilateur /checked+. Vous pouvez également effectuer des conversions non contrôlées à l'aide du mot clé unchecked et de l'opérateur de cast ou en spécifiant l'option de compilateur /checked-. Par défaut, les conversions explicites ne sont pas contrôlées. En Visual Basic, vous pouvez effectuer des conversions contrôlées en désactivant la case à cocher Supprimer les contrôles de dépassement sur les entiers dans la boîte de dialogue Paramètres avancés du compilateur du projet ou en spécifiant l'option de compilateur /removeintchecks-. Pour effectuer des conversions non contrôlées, activez la case à cocher Supprimer les contrôles de dépassement sur les entiers dans la boîte de dialogue Paramètres avancés du compilateur du projet ou spécifiez l'option de compilateur /removeintchecks+. Par défaut, les conversions explicites sont contrôlées. |
L'exemple suivant, qui tente de convertir Int32.MaxValue en une valeur Byte, illustre un cast C# non contrôlé. Notez que bien que la valeur entière se situe hors de la plage du type de données Byte cible, la conversion ne lève pas d'exception OverflowException.
// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
byte myByte = (byte)myInt;
Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}
// The value of MyByte is 255, the maximum value of a Byte.
// No overflow exception is thrown.
L'exemple suivant illustre une conversion explicite utilisant la fonction CByte contrôlée en Visual Basic et le cast contrôlé en C# à l'aide du mot clé checked. Cet exemple tente de convertir Int32.MaxValue en une valeur Byte. Toutefois, étant donné que Int32.MaxValue se trouve en dehors de la plage du type de données Byte, une exception OverflowException est levée.
' The integer value is set to 2147483647.
Dim myInt As Integer = Integer.MaxValue
Try
Dim myByte As Byte = CByte(myInt)
Console.WriteLine("The byte value is {0}.", myByte)
Catch e As OverflowException
Console.WriteLine("Unable to convert {0} to a byte.", myInt)
End Try
' Attempting to convert Int32.MaxValue to a Byte
' throws an OverflowException.
// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
byte myByte = checked ((byte) myInt);
Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}
// Attempting to convert Int32.MaxValue to a Byte
// throws an OverflowException.
Notez que la conversion explicite peut produire des résultats différents selon les langages et que ces résultats peuvent différer du comportement de la méthode Convert correspondante. Consultez la documentation du langage que vous utilisez pour plus d'information sur le comportement des conversions explicites. Par exemple, lors de la conversion d'une valeur Double en valeur Int32 en Visual Basic avec la fonction CInt, un arrondi est effectué. Cependant, lorsque la même conversion est effectuée à l'aide d'une conversion explicite en C#, les valeurs de droite sont perdues. L'exemple de code suivant utilise la conversion explicite pour convertir une valeur double en une valeur entière.
Dim myDouble As Double = 42.72
Dim myInt As Integer = CInt(myDouble)
Console.WriteLine(myInt)
' myInt has a value of 43.
Double myDouble = 42.72;
int myInt = checked ((int)myDouble);
Console.WriteLine(myInt);
// myInt has a value of 42.