Conversioni di ampliamento e restrizione (Visual Basic)
Una considerazione importante con una conversione del tipo è se il risultato della conversione è compreso nell'intervallo del tipo di dati di destinazione.
Una conversione più ampia modifica un valore in un tipo di dati che può consentire qualsiasi valore possibile dei dati originali. Le conversioni con estensione mantengono il valore di origine, ma possono modificare la relativa 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 frazionaria 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
La tabella seguente illustra le conversioni con estensione standard.
Tipo di dati | 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 |
Breve | Short , Integer , Long , Decimal , Single , Double |
Ushort | UShort , Integer , UInteger , Long , ULong , Decimal , Single , Double |
Integer | Integer , Long , Decimal , Single , Double 2 |
UInteger | UInteger , Long , ULong , Decimal , Single , Double 2 |
Long | Long , Decimal , Single , Double 2 |
Ulong | ULong , Decimal , Single , Double 2 |
Decimale | Decimal , Single , Double 2 |
Singolo | Single , Double |
Double | Double |
Qualsiasi tipo enumerato (Enum) | Tipo integrale sottostante e qualsiasi tipo a cui si estende il tipo sottostante. |
Char | Char , String |
Matrice Char |
Char Matrice String |
Qualsiasi tipo | Object |
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 in 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 suoi tipi di base sia più ampia. La giustificazione è che il tipo derivato contiene tutti i membri del tipo di base, quindi viene qualificato come istanza del tipo di base. Nella direzione opposta, il tipo di base non contiene nuovi membri definiti dal tipo derivato.
Le conversioni più ampliate hanno sempre esito positivo in fase di esecuzione e non comportano mai perdite 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 verso un tipo di dati più piccolo
Le conversioni di tipo narrowing standard includono quanto segue:
Direzioni inversa delle conversioni verso l'estensione nella tabella precedente (ad eccezione del fatto che ogni tipo si estende a se stesso)
Conversioni in entrambe le direzioni tra booleano 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 DateConversioni da un tipo di dati o un tipo di oggetto a un tipo derivato da esso
Le conversioni di tipo narrow non hanno sempre esito positivo in fase di esecuzione e possono avere esito negativo o causare perdite di dati. Se il tipo di dati di destinazione non può ricevere il valore convertito, si verifica un errore. Ad esempio, una conversione numerica può comportare un overflow. Il compilatore non consente di eseguire conversioni di tipo narrowing 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 di tipo narrowing viene eliminato per le conversioni dagli elementi di una For Each…Next
raccolta alla variabile di controllo del ciclo. Per altre informazioni ed esempi, vedere la sezione "Conversioni strette" in For Each... Istruzione successiva.
Quando usare conversioni di tipo narrowing
Quando si sa che il valore di origine può essere convertito nel tipo di dati di destinazione senza errori o perdita di dati, si usa una conversione verso un tipo di dati più piccolo. Ad esempio, se si dispone di un oggetto String
che si conosce contiene "True" o "False", è possibile usare la CBool
parola chiave per convertirla in Boolean
.
Eccezioni durante la conversione
Poiché le conversioni con estensione hanno sempre esito positivo, non generano eccezioni. Le conversioni di tipo narrowing, quando hanno esito negativo, generano in genere le eccezioni seguenti:
InvalidCastException — se non viene 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, che CType
può generare qualsiasi eccezione ritenuta appropriata. Inoltre, ciò CType
potrebbe chiamare funzioni di Visual Basic o metodi .NET Framework, che a sua volta potrebbero generare un'ampia gamma di eccezioni.
Modifiche durante le conversioni dei tipi di 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ò modificare è 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 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
Vedi anche
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: nel corso del 2024 verranno dismessi i problemi di GitHub come meccanismo di feedback per il contenuto e verranno sostituiti con un nuovo sistema di feedback. Per altre informazioni, vedere:Invia e visualizza il feedback per