Condividi tramite


Conversioni di ampliamento e restrizione

Aggiornamento: Luglio 2008

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. Una conversione di ampliamento esegue il passaggio di un valore a un tipo di dati in grado di contenere tutti i valori possibili dei dati originali. 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.

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

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

Decimal

Decimal, Single, Double2

Single

Single, Double

Double

Double

Qualsiasi tipo enumerato (Enum)

Il tipo integrale sottostante e qualsiasi tipo di dati più grande in cui viene convertito il tipo sottostante

Char

Char, String

Matrice Char

Char matrice, String

Qualsiasi tipo

Object

Qualsiasi tipo derivato

Qualsiasi tipo di base da cui sia derivato 3

Qualsiasi tipo

Qualsiasi interfaccia esso implementi

Nothing

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 un insieme 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. Se ad esempio si ha un valore String che si è certi contenga "True" o "False", sarà possibile utilizzare la parola chiave CBool per convertirlo in un valore 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 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.

Vedere anche

Attività

Procedura: convertire un oggetto in un altro tipo in Visual Basic

Concetti

Tipi di dati in Visual Basic

Conversioni implicite ed esplicite

Modifiche ai valori durante la conversione

Conversioni fra stringhe e altri tipi

Conversioni di matrici

Programmazione senza tipi in Visual Basic

Riferimenti

Riepilogo dei tipi di dati (Visual Basic)

Funzioni di conversione del tipo

Altre risorse

Conversioni di tipi in Visual Basic

Cronologia delle modifiche

Date

History

Motivo

Luglio 2008

Aggiunta una nota sulle conversioni verso un tipo di dati più piccolo e su For Each…Next.

Commenti e suggerimenti dei clienti.