Conversioni di ampliamento e restrizione (Visual Basic)

Una considerazione importante con una conversione del tipo è se il risultato della conversione rientra nell'intervallo del tipo di dati di destinazione.

Una conversione che supporta un maggior numero di dati modifica un valore in un tipo di dati che può consentire qualsiasi valore possibile dei dati originali. Le conversioni che supportano un maggior numero di dati mantengono 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 a String.

Una conversione verso un tipo di dati più piccolo imposta un valore su un tipo di dati che potrebbe non contenere alcuni dei possibili valori. Ad esempio, un valore frazionario viene arrotondato quando viene convertito in un tipo integrale e un tipo numerico convertito in Boolean viene ridotto a True o False.

Conversioni verso un tipo di dati più grande

Nella tabella seguente vengono illustrate le conversioni standard che supportano un maggior numero di dati.

Tipo di dati Si estende ai tipi di dati 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, Double2
UInteger UInteger, Long, ULong, Decimal, Single, Double2
Long Long, Decimal, Single, Double2
ULong ULong, Decimal, Single, Double2
Decimale Decimal, Single, Double2
Singolo Single, Double
Double Double
Qualsiasi tipo enumerato (Enum) Rispettivo tipo integrale sottostante e qualsiasi tipo a cui il tipo sottostante si estende.
Char Char, String
Matrice Char Matrice Char, String
Qualsiasi tipo Oggetto
Qualsiasi tipo derivato Qualsiasi tipo di base da cui deriva 3.
Qualsiasi tipo Qualsiasi interfaccia implementata.
Nothing Qualsiasi tipo di dati o tipo di oggetto.

1 Per definizione, ogni tipo di dati si estende a se stesso.

2 Le conversioni da Integer, UInteger, Long, ULong o Decimal a Single o Double possono comportare una perdita di precisione, ma mai una perdita di grandezza. In questo senso non comportano perdite di informazioni.

3 Potrebbe sembrare sorprendente che una conversione da un tipo derivato a uno dei rispettivi tipi di base supporti un maggior numero di dati. La motivazione è che il tipo derivato contiene tutti i membri del tipo di base, quindi si qualifica come istanza del tipo di base. Nella direzione opposta, il tipo di base non contiene nuovi membri definiti dal tipo derivato.

Le conversioni che supportano un maggior numero di dati hanno sempre esito positivo 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 del tipo su On o su Off.

Conversioni verso un tipo di dati più piccolo

Le conversioni standard che supportano un minor numero di dati includono quanto segue:

  • Le direzioni inverse delle conversioni che supportano un maggior numero di dati nella tabella precedente, ad eccezione del fatto che ogni tipo si estende a se stesso

  • Conversioni in entrambe le direzioni tra valori booleani e qualsiasi tipo numerico

  • Conversioni da qualsiasi tipo numerico a qualsiasi tipo enumerato (Enum)

  • Conversioni in entrambe le direzioni tra String e qualsiasi tipo numerico, Boolean, o Data

  • Conversioni da un tipo di dati o un tipo di oggetto a un tipo derivato da esso

Le conversioni che supportano un minor numero di dati non hanno sempre esito positivo in fase di esecuzione e possono avere esito negativo o causare perdite di dati. Si verifica un errore se il tipo di dati di destinazione non può ricevere il valore da convertire. Ad esempio, una conversione numerica può comportare un overflow. Il compilatore non consente di eseguire in modo implicito conversioni che supportano un minor numero di dati, a meno che l'Istruzione Option Strict non imposti l'opzione di controllo del tipo su Off.

Nota

L'errore di conversione che supporta un minor numero di dati viene eliminato per le conversioni dagli elementi di una raccolta For Each…Next alla variabile di controllo del ciclo. Per altre informazioni ed esempi, vedere la sezione "Conversioni che supportano un minor numero di dati" in Istruzione For Each...Next.

Quando usare le conversioni che supportano un minor numero di dati

Si usa una conversione che supporta un minor numero di dati quando si sa che il valore di origine può essere convertito nel tipo di dati di destinazione senza errori o perdita di dati. Ad esempio, se si ha una String e si sa che contiene "True" o "False", è possibile usare la parola chiave CBool per convertirla in Boolean.

Eccezioni durante la conversione

Poiché le conversioni che supportano un maggior numero di dati hanno sempre esito positivo, non generano eccezioni. Quando le conversioni che supportano un minor numero di dati hanno esito negativo, generano solitamente le eccezioni seguenti:

  • 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 da usare come operatore di conversione da o verso tale classe o struttura, tale CType può generare qualsiasi eccezione ritenuta appropriata. Tale CType potrebbe inoltre chiamare funzioni di Visual Basic o metodi di .NET Framework, che a loro volta potrebbero generare un'ampia gamma di eccezioni.

Modifiche durante le conversioni dei tipi riferimento

Una conversione da un tipo riferimento copia solo il puntatore al valore. Il valore stesso non viene copiato né modificato in alcun modo. L'unica cosa che può cambiare è il tipo di dati della variabile che contiene il puntatore. Nell'esempio seguente il tipo di dati viene convertito dalla classe derivata alla relativa classe base, ma l'oggetto a cui entrambe le variabili puntano ora è 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  

Vedi anche