Conversioni di ampliamento e restrizione (Visual Basic)
Un aspetto importante da considerare durante una conversione di tipo è se il risultato della conversione è compreso o meno nell'intervallo del tipo di dati di destinazione.
In conversione di ampliamento modifica di un valore a un tipo di dati che può consentire tutti i valori possibili dei dati originali. Le conversioni verso un tipo di dati più grande preservano il valore di origine ma possono modificarne la rappresentazione. Ciò si verifica se si esegue la conversione da un tipo integrale a Decimal, o da Char in String.
Una conversione di restrizione esegue il passaggio di un valore a un tipo di dati che potrebbe non essere in grado di contenere alcuni dei valori possibili. Ad esempio, un valore frazionario viene arrotondato quando viene convertito in un tipo integrale e un tipo numerico convertito in Boolean viene ridotto peruna o l'altra True o False.
Conversioni di ampliamento
Nella tabella che segue sono illustrate le conversioni di ampliamento standard.
Tipo di dati |
Tipi di dati risultanti dalla conversione a un tipo di dati più grande 1 |
SByte, Short, Integer, Long, Decimal, Single, Double |
|
Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double |
|
Short, Integer, Long, Decimal, Single, Double |
|
UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double |
|
Integer, Long, Decimal, Single, Double2 |
|
UInteger, Long, ULong, Decimal, Single, Double 2 |
|
Long, Decimal, Single, Double 2 |
|
ULong, Decimal, Single, Double 2 |
|
Decimal, Single, Double 2 |
|
Single, Double |
|
Double |
|
Qualsiasi tipo enumerato (Enum) |
Il tipo integrale sottostante e qualsiasi tipo che viene convertito il tipo sottostante. |
Char, String |
|
Matrice Char |
Matrice Char, String |
Qualsiasi tipo |
|
Qualsiasi tipo derivato |
qualsiasi tipo di base da cui è derivato 3. |
Qualsiasi tipo |
qualsiasi interfaccia che implementa. |
qualsiasi tipo di dati o tipo di oggetto. |
1 Per definizione, ogni tipo di dati viene ampliato in se stesso.
2 Le conversioni da Integer, UInteger, Long, ULong o Decimal a Single o Double possono comportare una perdita nella precisione, ma non una riduzione dell'ordine di grandezza. In questo senso non sono soggette a perdita di informazioni.
3 Può apparire sorprendente che una conversione da un tipo derivato a uno dei relativi tipi di base sia una conversione di ampliamento. Il motivo è che il tipo derivato contiene tutti i membri del tipo di base, pertanto viene qualificato come un'istanza del tipo di base. Viceversa, il tipo di base non contiene nuovi membri definiti dal tipo derivato.
Le conversioni di ampliamento vengono sempre eseguite correttamente in fase di esecuzione e non comportano mai una perdita di dati. È sempre possibile eseguirle in modo implicito, indipendentemente dal fatto che l'Istruzione Option Strict imposti l'opzione di controllo dei tipi su On o su Off.
Conversioni di restrizione
Di seguito sono elencate le conversioni di restrizione standard:
Le direzioni inverse delle conversioni di ampliamento elencate nella tabella precedente (tranne quella che prevede che ogni tipo viene ampliato in se stesso)
Le conversioni, in entrambe le direzioni, tra valori Boolean e un qualsiasi tipo numerico
Le conversioni da un qualsiasi tipo numerico in un qualsiasi tipo enumerato (Enum)
Le conversioni, in entrambe le direzioni, tra valori String e un qualsiasi tipo numerico, Boolean o Date
Le conversioni da un tipo di dati o tipo di oggetto a un tipo da esso derivato
Le conversioni di restrizione non vengono sempre eseguite correttamente in fase di esecuzione e possono causare una perdita di dati. Viene generato un errore se il tipo di dati di destinazione non è in grado di ricevere il valore convertito. Una conversione numerica ad esempio può comportare un overflow. Il compilatore non consente di eseguire conversioni di restrizione in modo implicito, a meno che l'Istruzione Option Strict non imposti l'opzione di controllo dei tipi su Off.
Nota
L'errore di conversione verso un tipo di dati più piccolo viene eliminato per le conversioni dagli elementi di una raccolta For Each…Next alla variabile di controllo del ciclo.Per ulteriori informazioni ed esempi, vedere la sezione "Conversioni verso tipi di dati più piccoli" di Istruzione For Each...Next (Visual Basic).
Quando utilizzare le conversioni di restrizione
Si consiglia di utilizzare una conversione di restrizione quando si è certi che il valore di origine può essere convertito nel tipo di dati di destinazione senza errori o perdita di dati. Ad esempio, se si dispone di un oggetto String stabilito contiene o “true„ o “False„, è possibile utilizzare CBool parola chiave per convertirla a Boolean.
Eccezioni durante la conversione
Dal momento che hanno sempre esito positivo, le conversioni di ampliamento non generano eccezioni. Quando non riescono, le conversioni di restrizione generano di solito le seguenti eccezioni:
InvalidCastException: se non è definita alcuna conversione tra i due tipi
OverflowException: (solo tipi integrali) se il valore convertito è troppo grande per il tipo di destinazione
Se una classe o una struttura definisce una Funzione CType (Visual Basic) da utilizzare come operatore di conversione rispetto a tale classe o struttura, la funzione CType può generare qualsiasi eccezione ritenuta appropriata. Inoltre, l'oggetto CType potrebbe chiamare funzioni di Visual Basic o metodi di .NET Framework che a loro volta potrebbero generare diverse eccezioni.
Modifiche durante conversioni di tipi riferimento
Una conversione da un tipo di riferimento copia solo il puntatore al valore. Il valore in sé non viene in alcun modo copiato né modificato. L'unica differenza può essere rappresentata dal tipo di dati della variabile contenente il puntatore. Nell'esempio che segue il tipo di dati viene convertito dalla classe derivata nella relativa classe di base, ma l'oggetto al quale ora puntano entrambe le variabili è invariato.
' 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
Vedere anche
Attività
Procedura: convertire un oggetto in un altro tipo in Visual Basic
Riferimenti
Riepilogo dei tipi di dati (Visual Basic)
Funzioni di conversione del tipo (Visual Basic)
Concetti
Conversioni implicite ed esplicite (Visual Basic)
Conversioni fra stringhe e altri tipi (Visual Basic)
Conversioni di matrici (Visual Basic)