Condividi tramite


Conversione esplicita

Aggiornamento: novembre 2007

La conversione esplicita è una modalità di conversione specifica del linguaggio. Alcuni compilatori richiedono la conversione esplicita per supportare le conversioni di restrizione.

Mentre la maggior parte dei linguaggi che si avvalgono di Common Language Runtime supporta le conversioni esplicite, il meccanismo con cui queste conversioni vengono eseguite cambia di linguaggio in linguaggio. Per alcuni linguaggi destinati a Common Language Runtime può essere necessario eseguire in modo esplicito una specifica conversione, mentre per altri lo stesso tipo di conversione può essere eseguito implicitamente. Analogamente, alcuni linguaggi possono richiedere che una specifica conversione venga eseguita in modo esplicito in alcune condizioni, ad esempio se Option Strict è impostato in Visual Basic, ma in modo implicito in altre condizioni, ad esempio se Option Strict non è impostato in Visual Basic. Per ulteriori informazioni sulla conversione esplicita, vedere la documentazione relativa al linguaggio utilizzato.

In alcuni linguaggi, ad esempio C# e C++, la conversione esplicita viene eseguita mediante operazioni di casting. Il casting si verifica quando viene aggiunto un prefisso con un tipo di dati che definisce il tipo di conversione che si desidera eseguire. In altri linguaggi, ad esempio Visual Basic, la conversione esplicita viene eseguita chiamando una funzione di conversione. In Visual Basic la funzione CType o una delle funzioni di conversione di tipo specifico, ad esempio CStr o CInt, viene utilizzata per consentire conversioni esplicite di tipi di dati non consentiti in modo implicito.

La maggior parte dei compilatori consentono l'esecuzione di conversioni esplicite in modalità controllata o non controllata. Quando si esegue una conversione in modalità controllata, OverflowException viene generata se il valore del tipo da convertire non rientra nell'intervallo del tipo di destinazione. Se si esegue una conversione in modalità non controllata nelle stesse condizioni, è probabile che l'eccezione non venga generata, ma il comportamento della conversione risulterà non definito e può essere restituito un valore non corretto.

Nota:

In C# le conversioni in modalità controllata possono essere eseguite utilizzando la parola chiave checked con l'operatore di casting o specificando l'opzione del compilatore /checked+. Viceversa, le conversioni in modalità non controllata possono essere eseguite utilizzando la parola chiave unchecked con l'operatore di cast o specificando l'opzione del compilatore /checked-. Per impostazione predefinita, le conversioni esplicite vengono eseguite in modalità non controllata. In Visual Basic è possibile eseguire conversioni in modalità controllata deselezionando la casella di controllo Rimuovi controllo dell'overflow di valori integer nella finestra di dialogo Impostazioni del compilatore avanzate del progetto o specificando l'opzione del compilatore /removeintchecks-. Viceversa, le conversioni in modalità non controllata possono essere eseguite selezionando la casella di controllo Rimuovi controllo dell'overflow di valori integer nella finestra di dialogo Impostazioni del compilatore avanzate del progetto o specificando l'opzione del compilatore /removeintchecks+. Per impostazione predefinita, le conversioni esplicite vengono eseguite in modalità controllata.

Nell'esempio seguente, in cui si tenta di convertire Int32.MaxValue in un valore Byte, viene illustrato un cast in C# in modalità non controllata. Si noti che, anche se il valore integer non rientra nell'intervallo del tipo di dati Byte di destinazione, la conversione non genera 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.

Nell'esempio seguente viene illustrata una conversione esplicita mediante la funzione CByte controllata in Visual Basic e il casting in modalità controllata in C# tramite la parola chiave checked. In questo esempio si tenta di convertire Int32.MaxValue in un valore Byte. Tuttavia, poiché Int32.MaxValue non rientra nell'intervallo del tipo di dati Byte, viene generata OverflowException.

' 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.

Si noti che la conversione esplicita può produrre risultati diversi in linguaggi diversi e che tali risultati possono differire dal comportamento del metodo Convert corrispondente. Per informazioni sul comportamento delle conversioni esplicite, consultare la documentazione relativa al linguaggio utilizzato. Quando, ad esempio, si converte un valore Double in un valore Int32 in Visual Basic mediante la funzione CInt, viene eseguito un arrotondamento. Se si esegue lo stesso tipo di conversione in modo esplicito in C#, vengono perduti i valori a destra del separatore decimale. Nell'esempio seguente viene eseguita una conversione esplicita da un valore Double a un valore integer.

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.

Vedere anche

Riferimenti

System.Convert

Altre risorse

Conversione di tipi